精华内容
下载资源
问答
  • C++ Windows窗口编程方法解释,包括MFC方式的SDI、MDI方式
  • Windows编程之注册窗口类 介绍了 注册窗口类。接下来就是创建窗体。   我们用Visual Studio创建一个win32项目上会自动生成一个创建窗体函数。如下:  // // 函数: InitInstance(HINSTANCE, int) /
    
    
    Windows编程之注册窗口类 介绍了 注册窗口类。接下来就是创建窗体。 
         我们用Visual Studio创建一个win32项目上会自动生成一个创建窗体函数。如下: 
    //
    //   函数: InitInstance(HINSTANCE, int)
    //
    //   目的: 保存实例句柄并创建主窗口
    //
    //   注释:
    //
    //        在此函数中,我们在全局变量中保存实例句柄并
    //        创建和显示主程序窗口。
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;
    
       hInst = hInstance; // 将实例句柄存储在全局变量中
    
       hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
       return TRUE;
    }
    下面一句一句解释: 
    HWND hWnd; 
          h 是类型描述,表示句柄, Wnd 是变量对象描述,表示窗口,所以hWnd 表示窗口句柄 。 通俗地说,如果把一个到处跑的人当作指针的话,那么HWND就是该人的身份证----我想应该是身份证号码 
      
    hInst是项目自动生成的一个全局变量,代码如下: HINSTANCE hInst; // 当前实例所以这句话的意识就是将实例句柄存储在全局变量中。 
    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 
     CreateWindow函数创建一个重叠式窗口、弹出式窗口或子窗口。它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的)。函数也指该窗口的父窗口或所属窗口(如果存在的话),及窗口的菜单。若要使用除CreateWindow函数支持的风格外的扩展风格,则使用CreateWindowEx函数代替CreateWindow函数。函数原型为:
    HWND CreateWindow(
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent,
    HMENU hMenu,
    HANDLE hlnstance,
    LPVOID lpParam);

    风   格    宏 解    释
    WS_border 单线边框
    WS_caption 有标题框的窗口(包括WS_BODER风格)
    WS_popup 作为一个弹出式窗口
    WS_child 作为子窗体(与WS_popup互斥)
    WS_disabled 窗口不能初始化,并且屏蔽与用户的交互
    WS_dlgframe 窗口的外观类似与对话框
    WS_group 作为窗体的控件,可以与其他控件组合
    WS_hscroll 窗口具有水平滚动条
    WS_vscroll 窗口具有垂直滚动条
    WS_maximize 初始状态为最大化的窗口
    WS_maximizebox 窗口右上角有一个最大化按钮
    WS_minimize 初始状态为最小化的窗口
    WS_minimizebox 窗口右上角有一个最小化按钮
    WS_overlappedwindow 这是一个宏组合。为了方便书写,它等价于WS_overlapped|WS_caption|WS_sysmenu|WS_thickframe|WS_minimizebox|WS_maximizebox
    WS_overlapped 边框重叠的窗口
    WS_sizebox 窗口的边框可以变化
    WS_sysmenu 在窗口的标题栏的最左上角有一个窗口菜单
    WS_tabstop 窗口作为控件,并且交互可以停留在这个控件上
    WS_visible 窗口建立的初始状态是可见的
    x,y,nWidth,nHeight 制定了窗口的位置和大小,x和y指定初始左定点坐标,nWidth和nHeight指定宽度和高度。 hWndParent 指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗口是可选的。 hMenu 菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。 hInstance 在早期的操作系统中,如Windows 95/98/Me,该参数指定与窗口相关的模块实例的句柄,而在较新的操作系统中,如Windows NT/2000/XP/7,可以不理睬该参数。 lpPraram 指向一个值的指针,该值传递给窗口 WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。
    if (!hWnd)
       {
          return FALSE;
       }
    如果创建 窗口句柄 失败,则返回错误 
    ShowWindow(hWnd, nCmdShow);
    显示窗体,ShowWindow函数的原型为BOOL ShowWindow(HWND hWnd,int nCmdShow);第一个参数指定要显示窗口的句柄,第二个参数指定窗口的显示方式,如果加载应用程序提供了STARTUPINFO结构,则应用第一次调用ShowWindow函数时不理财该参数;否则,应用第一次调用ShowWindow函数时从WinMain函数的nCmdShow参数中获取实际值。在后续的函数调用中,nCmdShow的值可以说下表中的任意一个。 

    UpdateWindow(hWnd);
    
    如果窗口更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT消息来更新指定窗口的客户区。函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。(表中风格宏都应为大写,为方便阅读,我使用小写,写程序是须使用大写) 
    显   示    宏 结    果
    SW_forceminimize 在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数
    SW_hide 隐藏窗口并激活其他窗口
    SW_mazimize 最大化指定的窗口
    SW_minimize 最小化指定的窗口。
    SW_restore 激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志
    SW_show 在窗口原来的位置以原来的尺寸激活和显示窗口
    SW_showdefault 依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。
    SW_showmaximized 激活窗口并将其最大化
    SW_showminimized 激活窗口并将其最小化
    SW_showminnoactive 窗口最小化,并不激活窗口,但激活窗口仍然维持激活状态
    SW_showna 以窗口原来的状态显示窗口,激活窗口仍然维持激活状态
    SW_shownoactivate 以窗口最近一次的大小和状态显示窗口,激活窗口仍然维持激活状态
    SW_shownormal 激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志
    展开全文
  • C++Windows编程之注册窗口

    千次阅读 2013-01-15 20:28:55
    我们用Visual Studio创建一个win32项目上会自动生成一个注册窗口类。如下: // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex....
    我们用Visual Studio创建一个win32项目上会自动生成一个注册窗口类。如下:
    //
    //  函数: MyRegisterClass()
    //
    //  目的: 注册窗口类。
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    	WNDCLASSEX wcex;
    
    	wcex.cbSize = sizeof(WNDCLASSEX);
    
    	wcex.style			= CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc	= WndProc;
    	wcex.cbClsExtra		= 0;
    	wcex.cbWndExtra		= 0;
    	wcex.hInstance		= hInstance;
    	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT5));
    	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
    	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_WIN32PROJECT5);
    	wcex.lpszClassName	= szWindowClass;
    	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
    	return RegisterClassEx(&wcex);
    }
    这些都是是什么意思呢?
    WNDCLASSEX属于一个窗台类结构原型为:
    typedef struct 
    
    {
    
        UINT cbSize;
    
        UINT style;
    
        WNDPROC lpfnWndProc;
    
        int cbClsExtra;
    
        int cbWndExtra;
    
        HINSTANCE hInstance;
    
        HICON hIcon;
    
        HCURSOR hCursor;
    
        HBRUSH hbrBackground;
    
        LPCTSTR lpszMenuName;
    
        LPCTSTR lpszClassName;
    
        HICON hIconSm;
    
    } WNDCLASSEX, *PWNDCLASSEX;
    
    cbSize存储表示该结构大小的字节数,通常以sizeof(WNDCLASSEX)的形式对该域进行设置。
    style存储表示窗口类风格的整数,它决定了该窗口的外观和内在特征。Windows以预先给了一些标准的外观,供用户选择。如下:

    当窗口的垂直位置或窗口的高度值发生变化时,是窗口能够重新绘制其用户区域的内容

    Constant/value

    Description

    CS_BYTEALIGNCLIENT

    0x1000

     

    在X轴方向上以某边界值对齐窗口的用户区域,该属性影响窗口的宽度和显示位置的水平坐标。

    CS_BYTEALIGNWINDOW

    0x2000

     

    在X轴方向上以某个边界值对齐窗口,该属性影响窗口的宽度和显示位置的水平坐标。

    CS_CLASSDC

    0x0040

    为窗口分配一个该类的所有窗口都共享的设备描述表。由于窗口类是进程指定的,一个应用中的多个线程就可能创建属于同一个窗口了的窗口,这些线程也就可以尝试同时使用设备描述表,但此时,系统只允许一个线程成功完成其图形输出。

    CS_DBLCLKS

    0x0008

    用户在属于该窗口类的窗口中双击鼠标时将鼠标双击消息发送到窗口处理函数。打开该函数才支持鼠标双击功能。

    CS_DROPSHADOW

    0x00020000

    Windows XP 中允许窗口的拖拉阴影效果。通过SPI_SETDROPSHADOW打开或关闭该功能。

    CS_GLOBALCLASS

    0x4000

    将窗口类指定为一个应用全局类,所谓的应用全局类就是在exe或dll中定义的窗口类,加载该exe或dll的进程都可以创建属于该窗口类的窗口。

    CS_HREDRAW

    0x0002

    当窗口的水平位置或窗口的宽度值发生变化时,是窗口能够重新绘制其用户区域的内容

    CS_NOCLOSE

    0x0200

    不能使用窗口菜单中的“关闭”功能

    CS_OWNDC

    0x0020

    为该类的每个窗口分配独立的设备描述表。

    CS_PARENTDC

    0x0080

    允许子窗体使用父窗体的设备描述表。

    CS_SAVEBITS

    0x0800

     

    当窗口中部分内容被遮挡时,自动保存图像,当被遮挡的区域恢复时,使用自动保存的图形来进行自动恢复。

    CS_VREDRAW

    0x0001

    lpfnWndProc 指向窗口处理函数(回调函数)。
        处理窗口事件,像单击鼠标会怎样,右击鼠标会怎样,都是由此函数控制的。
    存储指向窗口处理函数的指针。
    cbClsExtra 为窗口类的额外信息做记录,初始化为0
            存储指向指定分配给窗口类结构的附加字节数。
    cbWndExtra记录窗口实例的额外信息,系统初始为
    0。
        如果程序使用WNDCLASSEX注册一个从资源文件里创建的对话框,则此参数必须设置为DLGWINDOWEXTRA
    hInstance存储包含窗口类的窗口处理函数的实例的句柄。窗口类结构已经把窗口的基本属性包含在其中。由于每个程序都有唯一的实例句柄,因此,窗口类的hInstance属性直接表述了该窗口的性质。即每个程序可以设置各自独立的窗口类。
    hIcon存储该类窗口的图标的句柄。
          一个Windows程序有两个与其相关的图标,一个是32*32位图的标准图标,称为大图标,另一个是16*16位图的小图标。hIcon存储的是标准图标。该域必须是图标资源的句柄,若为NULL,这系统提供一个默认的图标。
    hCursor存贮表示窗口类光标的句柄,该域必须是一个光标资源的句柄。
            一般情况下使用一个内置光标。常见内置光标如下表:
    光标宏 形状
    IDC_ARROW    标准箭头
    IDC_CROSS 十字线
    IDC_HAND
    IDC_WAIT 沙漏
    IDC_SIZENS 上下双箭头
    IDC_SIZEWE 左右双箭头
    IDC_SIZEALL 四个方向箭头
    IDC_HELP 箭头和问好
    IDC_IBEAM 垂直I字形
    IDC_SIZENESW 右下角和左上角算箭头
    IDC_SIZENWSE 左上角和右下角算箭头
    hbrBackground窗口类的背景刷,为背景刷句柄,也可以为系统颜色值,如果颜色值已给出,则必须转化为以下的HBRUSH的值

    ·  COLOR_ACTIVEBORDER

    ·  COLOR_ACTIVECAPTION

    ·  COLOR_APPWORKSPACE

    ·  COLOR_BACKGROUND

    ·  COLOR_BTNFACE

    ·  COLOR_BTNSHADOW

    ·  COLOR_BTNTEXT

    ·  COLOR_CAPTIONTEXT

    ·  COLOR_GRAYTEXT

    ·  COLOR_HIGHLIGHT

    ·  COLOR_HIGHLIGHTTEXT

    ·  COLOR_INACTIVEBORDER

    ·  COLOR_INACTIVECAPTION

    ·  COLOR_MENU

    ·  COLOR_MENUTEXT

    ·  COLOR_SCROLLBAR

    ·  COLOR_WINDOW

    ·  COLOR_WINDOWFRAME

    ·  COLOR_WINDOWTEXT

    lpszMenuName存储以空结尾的指定类菜单资源名的字符串指针,类菜单资源名已经在资源文件中进行了定义。
           如果使用整数来表示菜单,则需要使用MAKEEINITSOURCE宏。如果该域为NUILL,属于该窗口类的窗口没有默认菜单。
    lpszClassName存储以空结尾的字符串的指针,或存储一个原子元素(ATOM)。
           ATOM本质上也是一个整数,通常用来做唯一标识。如果该域是一个原子元素,那么它必须是以前调用RegisterClass或RegisterClassEx函数所创建的类原子元素,该原子元素存于lpszClassName的低位字节中,其高位必须为0;如果lpzeClassName是一个字符串,则它指定窗口类的名字。
    hIConSm存储该类窗口小图标的句柄。
    此章节已结束,请看下一章节:Windows编程之创建窗口

    展开全文
  • //设置字体颜色 SetTextColor(hdc,RGB...//窗口背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce.hbrBackground=CreateSolidBrush(RGB(0,0,255)); //设置字体背景 SetBkColor(hdc,RGB(0,0,200));
    //设置字体颜色
    SetTextColor(hdc,RGB(255,0,0));


    //窗口背景
    //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    //wce.hbrBackground=CreateSolidBrush(RGB(0,0,255));


    //设置字体背景
    SetBkColor(hdc,RGB(0,0,200));
    //设置字体背景模式
    SetBkMode(hdc,TRANSPARENT);//字体背景透明
    //创建字体,成功返回字体,失败返回NULL
    HFONT CreateFont(
      int nHeight,               // 高度
      int nWidth,                // 宽度
      int nEscapement,           // 倾斜角度
      int nOrientation,          // 旋转角度(三维效果)
      int fnWeight,              // 粗细
      DWORD fdwItalic,           // 斜体
      DWORD fdwUnderline,        // 下划线
      DWORD fdwStrikeOut,        // 删除线
      DWORD fdwCharSet,          // 字符集(GB2312_CHARSET)
      DWORD fdwOutputPrecision,  // 输出精度(0)
      DWORD fdwClipPrecision,    // 剪切精度(0)
      DWORD fdwQuality,          // 质量(0)
      DWORD fdwPitchAndFamily,   // 匹配字体
      LPCTSTR lpszFace           // 字体名称(在C:\Windows\Fonts 打开具体的字体再看第一行名称)
    );




    对话框窗口
    //用户处理对话框指令的函数
    //返回TRUE 系统不默认处理;返回FALSE系统处理;
    INT_PTR CALLBACK DialogProc(  HWND hwndDlg,  // handle to dialog box
      UINT uMsg,     // message
      WPARAM wParam, // first message parameter
      LPARAM lParam  // second message parameter
      );
      //创建对话框
     INT_PTR DialogBox(  HINSTANCE hInstance,  // handle to module
      LPCTSTR lpTemplate,   // dialog box template
      HWND hWndParent,      // handle to owner window
      DLGPROC lpDialogFunc  // dialog box procedure
      );
    //模式对话框
    result=(int)DialogBox(g_hinstance,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,DialogProc);
    int CALLBACK DialogProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    UINT id=LOWORD(wParam);
    switch(uMsg)
    {
    case WM_SYSCOMMAND:
    if(wParam==SC_CLOSE)
    {
       EndDialog(hwnd,1);
    return true;
    }
    break;
    case WM_INITDIALOG://对话框创建之后、显示之前if(wParam==SC_CLOSE)
    {
    return true;
    }
    break;


    }
    return false;
    }
    //非模式对话框
    HWND dlg= CreateDialog(g_hinstance,MAKEINTRESOURCE(IDD_DIALOG2),hwnd,DialogProc2);
    ShowWindow(dlg,1);
    int CALLBACK DialogProc2(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    UINT id=LOWORD(wParam);
    switch(uMsg)
    {
    case WM_SYSCOMMAND:
    if(wParam==SC_CLOSE)
    {
    DestroyWindow(hwnd);
    return true;
    }
    break;
    case WM_INITDIALOG://对话框创建之后、显示之前
    {
    return true;
    }
    break;
    }
    return false;
    }


    //程序和子控件消息交互
    SendMessage


    day72 pm 85
    //创建文字静态框,HMENU参数传入控件ID
    CreateWindowEx(0,"STATIC","hello",WS_CHILD|WS_VISIBLE,100,100,
    200,40,hwnd,(HMENU)1001,g_hinstance,0);
    //创建图标静态框,HMENU参数传入控件ID,加入 SS_ICON或SS_BITMAP 风格
    //字符串 写 "#资源ID号",风格有 SS_NOTIFY 时,点击才能产生消息
    CreateWindowEx(0,"STATIC","#104",WS_CHILD|WS_VISIBLE|SS_ICON,100,100,
    200,40,hwnd,(HMENU)1002,g_hinstance,0);
    //更改图标
    HICON ico=LoadIcon(g_hinstance,MAKEINTRESOURCE(IDI_ICON1));
    HWND hs=GetDlgItem(hwnd,1002);//通过窗口句柄和控件ID号获取控件句柄
    SendMessage(hs,STM_SETICON,(WPARAM)ico,0);//发消息修改静态图标的图片


    按钮:
    普通下压式按钮:BS_PUSHBUTTON、BS_DEFPUSHBUTTON
    分组框按钮:BS_GROUPBOX
    复选框按钮:BS_CHECKBOX、BS_AUTOCHECKBOX、BS_3STATE、BS_AUTO3STATE
    单选框按钮:BS_RADIOBUTTON、BS_AUTORADIOBUTTON


    //手动维护复选框状态
    if(HIWORD(wparam)==BN_CLICKED)
    {
    HWND cb=GetDlgItem(hwnd,2002);//获取复选框控件
    UINT stat= SendMessage(cb,BM_GETCHECK,0,0);//获取当前状态
    //设置状态
    if(stat==BST_CHECKED) SendMessage(cb,BM_SETCHECK,BST_UNCHECKED,0);
    else SendMessage(cb,BM_SETCHECK,BST_CHECKED,0);
    }
    //手动维护3种状态复选框的状态
    //WM_COMMAND中,HIWORD(wparam):菜单-0,加速键-1,控件-通知码(BN_CLICKED/STN_CLICKED等)
    //lparam:菜单、加速键-NULL,控件:控件句柄
    if(HIWORD(wparam)==BN_CLICKED)
    {
    UINT id=LOWORD(wparam);
    HWND cb=GetDlgItem(hwnd,id);
    UINT stat= SendMessage(cb,BM_GETCHECK,0,0);//获取当前状态
    //设置状态
    if(stat==BST_CHECKED) SendMessage(cb,BM_SETCHECK,BST_INDETERMINATE,0);
    else if(stat==BST_INDETERMINATE) SendMessage(cb,BM_SETCHECK,BST_UNCHECKED,0);
    else SendMessage(cb,BM_SETCHECK,BST_CHECKED,0);
    }


    day72 pm over


    day73 am
    //创建单选框,两组(风格加 WS_GROUP,从当前开始到下一个此风格前一个结束为一组)
    CreateWindowEx(0,"BUTTON","RADIO E",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,50,260,
    100,30,hwnd,(HMENU)2006,g_hinstance,0);
    CreateWindowEx(0,"BUTTON","RADIO F",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,50,300,
    100,30,hwnd,(HMENU)2007,g_hinstance,0);
    CreateWindowEx(0,"BUTTON","RADIO G",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,50,340,
    100,30,hwnd,(HMENU)2008,g_hinstance,0);
    CreateWindowEx(0,"BUTTON","RADIO H",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,50,380,
    100,30,hwnd,(HMENU)2009,g_hinstance,0);
    //多态按钮,变相的复选按钮
    CreateWindowEx(0,"BUTTON","RADIO I",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE,50,420,
    100,30,hwnd,(HMENU)2010,g_hinstance,0);


    编辑框:
    单行编辑框:只能输入一行。
    多行编辑框:ES_MULTILINE|WS_VSCROLL|ES_AUTOVSCROLL,可输入回车
    密码编辑框:ES_PASSWORD,只能单行,不能用ES_MULTILINE
    只能输入数字:ES_NUMBER
    windows控件所有风格:Window Styles,编辑框所有风格:edit styles 可查msdn。
    //设置控件内容WM_SETTEXT
    //获取控件内容WM_GETTEXT
    //获取内容长度WM_GETTEXTLENGTH
    SendMessage(
      (HWND) hWnd,// 控件句柄
      WM_SETTEXT/WM_GETTEXT/WM_GETTEXTLENGTH,// 消息
      (WPARAM) wParam,//获取时,写buff最大大小,其他传0
      (LPARAM) lParam// 字符串地址
    );
    HWND he=GetDlgItem(hwnd,1001);
    HFONT font=CreateFont(30,0,0,0,900,0,0,0,
    GB2312_CHARSET,0,0,0,0,"黑体");
    SendMessage(he,WM_SETFONT,(WPARAM)font,1);//修改字体
    WM_CTLCOLOREDIT   //修改edit背景颜色
    //窗口处理函数中
    case WM_CTLCOLOREDIT:
    {
    SetBkMode((HDC)wparam,TRANSPARENT);//文本背景设为透明
    //SetBkColor((HDC)wparam,RGB(0,230,0));
    return (LRESULT)CreateSolidBrush(RGB(0,230,0));
    }
    break;
    //文字改变时通知  EN_CHANGE
    //设置窗口标题    SetWindowText,GetWindowText


    组合框 COMBOBOX
    HWND com1= CreateWindowEx(0,"COMBOBOX","",WS_CHILD|WS_VISIBLE|CBS_SIMPLE,
    50,50,200,200,hwnd,(HMENU)1001,g_hinstance,0);//简单组合框
    HWND com2= CreateWindowEx(0,"COMBOBOX","",WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWN,
    260,50,200,200,hwnd,(HMENU)1002,g_hinstance,0);//下拉式
    HWND com3=CreateWindowEx(0,"COMBOBOX","",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
    470,50,200,200,hwnd,(HMENU)1003,g_hinstance,0);//下拉列表式
    HFONT font=CreateFont(30,0,0,0,900,0,0,0,GB2312_CHARSET,0,0,0,0,"黑体");
    SendMessage(com1,WM_SETFONT,(WPARAM)font,0);//设置字体


    CB_ADDSTRING  追加选项
    CB_FINDSTRING 查找,返回index
    CB_DELETESTRING 删除,根据index删除
    CB_INSERTSTRING 插入
    CB_RESETCONTENT 清除所有项
    CB_SETCURSEL 设置选中索引
    CB_SELECTSTRING 设置选中的字符串
    CB_GETLBTEXT  获取选择的文字,CB_GETLBTEXTLEN 获取文字长度


    day73 pm 136
    //删除选项
    HWND com2=GetDlgItem(hwnd,1002);
    int index=0;//SendMessage(com2,CB_GETCURSEL,0,0);
    char* s="item1";
    char a[100]={0};
    //模糊查找,返回第一个匹配的索引
    index=SendMessage(com2,CB_FINDSTRING,(WPARAM)-1,(LPARAM)s);
    //SendMessage(com2,CB_SELECTSTRING,(WPARAM)-1,(LPARAM)s);//模糊匹配,并设置被选择
    if(index!=CB_ERR)
    {
    SendMessage(com2,CB_GETLBTEXT,(WPARAM)index,(LPARAM)a);//取模糊匹配的文字
    if(strcmp(s,a)==0)//判断是否完全匹配
    {
    SendMessage(com2,CB_DELETESTRING,index,0);
    SendMessage(com2,CB_SETCURSEL,(WPARAM)index,0);
    }
    }
    SendMessage(com2,CB_SETITEMDATA,index,1000+i);//设置附加数据
    int data=SendMessage(com2,CB_GETITEMDATA,index,0);//获取附加数据
    char b[10]={0};
    sprintf(b,"%d",data);


    day73 pm over!
    CBN_SELCHANGE  选择项改变时产生的消息
    CBN_EDITCHANGE  输入改改时产生的消息:
    LRESULT CALLBACK WindowProc(
      HWND hwnd,       // handle to window
      UINT uMsg,       // WM_COMMAND
      WPARAM wParam,   // combo box identifier, CBN_EDITCHANGE
      LPARAM lParam    // handle to combo box (HWND)
    );
    在WM_COMMAND事件中,选择项改变时,发生通知事件


    case 1001://第1个下拉框ID
    {
    if(HIWORD(wparam)==CBN_SELCHANGE)
    {
    HWND com1=GetDlgItem(hwnd,1001);
    HWND com2=GetDlgItem(hwnd,1002);
    HWND com3=GetDlgItem(hwnd,1003);
    int index=SendMessage(com1,CB_GETCURSEL,0,0);
    if(index!=CB_ERR)
    {
    SendMessage(com2,CB_SETCURSEL,index,0);
    SendMessage(com3,CB_SETCURSEL,index,0);
    }
    }
    }
    break;


    列表框:LISTBOX
    单列列表框-样式默认
    多列列表框-样式加 LBS_MULTICOLUMN
    操作选择与COMBOBOX一样,CB_改为LB_,如:添加项由CB_ADDSTRING改为 LB_ADDSTRING,当选择项改变后WM_COMMAND通知事件:LBN_SELCHANGE。



    第一个程序:

    资源ID,图片:


    加了资源,必须记得包含 resource.h


    主要cpp代码:

    // win32app.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "resource.h"
    #include <stdio.h>
    HINSTANCE g_hinstance=0;//全局句柄
    HANDLE g_houtput=0;
    void OnCreate(HWND hwnd,LPARAM lparam)
    {
    // 		char txt[200]={0};
    // 		ScreenToClient(hwnd,&pt);
    	// 		sprintf(txt,"%d,%d ; %d,%d,%d,%d\n",pt.x,pt.y,rc.top,rc.left,rc.right,rc.bottom);
    	// 		
    // 		WriteConsole(g_houtput,txt,strlen(txt),NULL,NULL);
    	/*
    	CreateWindowEx(0,"STATIC","hello",WS_CHILD|WS_VISIBLE,100,100,
    		200,40,hwnd,(HMENU)1001,g_hinstance,0);
    	CreateWindowEx(0,"STATIC","#104",WS_CHILD|WS_VISIBLE|SS_ICON|SS_NOTIFY,300,100,
    		0,0,hwnd,(HMENU)1002,g_hinstance,0);
    	*/
    	///*
    	CreateWindowEx(0,"BUTTON","GroupBox",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,30,30,
    	300,400,hwnd,(HMENU)2000,g_hinstance,0);
    	CreateWindowEx(0,"BUTTON","btn1",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,50,50,
    		40,20,hwnd,(HMENU)2001,g_hinstance,0);
    	
    	CreateWindowEx(0,"BUTTON","Check A",WS_CHILD|WS_VISIBLE|BS_CHECKBOX,50,100,
    		100,30,hwnd,(HMENU)2002,g_hinstance,0);
    	CreateWindowEx(0,"BUTTON","Check B",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,50,140,
    		100,30,hwnd,(HMENU)2003,g_hinstance,0);
    	CreateWindowEx(0,"BUTTON","3state C",WS_CHILD|WS_VISIBLE|BS_3STATE,50,180,
    		100,30,hwnd,(HMENU)2004,g_hinstance,0);
    	CreateWindowEx(0,"BUTTON","3state D",WS_CHILD|WS_VISIBLE|BS_AUTO3STATE,50,220,
    		100,30,hwnd,(HMENU)2005,g_hinstance,0);//3种状态复选框
    	CreateWindowEx(0,"BUTTON","RADIO E",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,50,260,
    		100,30,hwnd,(HMENU)2006,g_hinstance,0);
    	CreateWindowEx(0,"BUTTON","RADIO F",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,50,300,
    		100,30,hwnd,(HMENU)2007,g_hinstance,0);
    	CreateWindowEx(0,"BUTTON","RADIO G",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,50,340,
    		100,30,hwnd,(HMENU)2008,g_hinstance,0);
    	CreateWindowEx(0,"BUTTON","RADIO H",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,50,380,
    		100,30,hwnd,(HMENU)2009,g_hinstance,0);
    	CreateWindowEx(0,"BUTTON","RADIO I",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE,50,420,
    		100,30,hwnd,(HMENU)2010,g_hinstance,0);//多态按钮,变相的复选按钮
    	//*/
    
    }
    //对话框处理函数
    int CALLBACK DialogProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    	switch(uMsg)
    	{
    	case WM_SYSCOMMAND:
    		if(wParam==SC_CLOSE)
    		{
    		    EndDialog(hwnd,1);
    			return true;
    		}
    		break;
    	case WM_INITDIALOG://对话框创建之后、显示之前if(wParam==SC_CLOSE)
    		{
    			return true;
    		}
    		break;
    
    	}
    	return false;
    }
    int CALLBACK DialogProc2(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    	switch(uMsg)
    	{
    	case WM_SYSCOMMAND:
    		if(wParam==SC_CLOSE)
    		{
    			DestroyWindow(hwnd);
    			return true;
    		}
    		break;
    	case WM_INITDIALOG://对话框创建之后、显示之前
    		{
    			
    			return true;
    		}
    		break;
    		
    	}
    	return false;
    }
    void oncommand(HWND hwnd,WPARAM wparam)
    {
    	UINT id=LOWORD(wparam);
    	int result=0;
    	HWND dlg=0;
    	switch(id)
    	{
    	case Dlg_Model:
    		result=(int)DialogBox(g_hinstance,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,DialogProc);
    		break;
    	case Dlg_Normal:
    	    dlg= CreateDialog(g_hinstance,MAKEINTRESOURCE(IDD_DIALOG2),hwnd,DialogProc2);
    		ShowWindow(dlg,1);
    		break;
    	case ID_Blue:
    		{
    			HICON ico=LoadIcon(g_hinstance,MAKEINTRESOURCE(IDI_ICON2));
    			SendMessage(GetDlgItem(hwnd,1002),STM_SETICON,(WPARAM)ico,0);
    			break;
    		}
    		
    	case ID_Black:
    		{
    			HICON ico=LoadIcon(g_hinstance,MAKEINTRESOURCE(IDI_ICON1));
    			HWND hs=GetDlgItem(hwnd,1002);//通过窗口句柄和控件ID号获取控件句柄
    			SendMessage(hs,STM_SETICON,(WPARAM)ico,0);//修改静态图标的图片
    			break;
    		}
    	case 1002:
    		{
    			
    			if(HIWORD(wparam)==STN_DBLCLK)
    			{
    				MessageBox(NULL,"双击图标","info",MB_OK);
    			}
    		}
    		break;
    	case 2001:
    
    		{
    			if(HIWORD(wparam)==BN_CLICKED)
    			{
    			MessageBox(NULL,"按钮点击","info",MB_OK);
    			}
    
    		}
    	case 2002:
    		{
    			if(HIWORD(wparam)==BN_CLICKED)
    			{			
    			HWND cb=GetDlgItem(hwnd,id);
    			UINT stat= SendMessage(cb,BM_GETCHECK,0,0);//获取当前状态
    			//设置状态
    			if(stat==BST_CHECKED) SendMessage(cb,BM_SETCHECK,BST_UNCHECKED,0);
    			else SendMessage(cb,BM_SETCHECK,BST_CHECKED,0);
    			}
    		}
    		break;
    	case 2004:
    		{
    			if(HIWORD(wparam)==BN_CLICKED)
    			{			
    				HWND cb=GetDlgItem(hwnd,id);
    				UINT stat= SendMessage(cb,BM_GETCHECK,0,0);//获取当前状态
    				//设置状态
    				if(stat==BST_CHECKED) SendMessage(cb,BM_SETCHECK,BST_INDETERMINATE,0);
    				else if(stat==BST_INDETERMINATE) SendMessage(cb,BM_SETCHECK,BST_UNCHECKED,0);
    				else SendMessage(cb,BM_SETCHECK,BST_CHECKED,0);
    			}
    		}
    		break;
    	}
    }
    //回调函数
    LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
    {
    	switch(msg)
    	{
    	case WM_SYSCOMMAND:
    		if(wparam==SC_CLOSE){
    			int ret=MessageBox(NULL,"是否退出","info",MB_YESNO);
    			if(ret==IDYES){
    				//下面代码会自动关闭和销毁
    				//PostQuitMessage(0);
    			}
    			else return 0;//不执行下面代码
    		}
    		break;
    		//在创建窗口之后还未显示的时候
    	case WM_CREATE:
    		OnCreate(hwnd,lparam);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	case WM_COMMAND:
    		oncommand(hwnd,wparam);
    			break;
    	}
    	return DefWindowProc(hwnd,msg,wparam,lparam);
    }
    //注册窗口类
    BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
    {
    	WNDCLASSEX wce={0};
    	wce.cbSize=sizeof(wce);
    	wce.cbClsExtra=200;
    	wce.cbWndExtra=200;
    	wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    	wce.hCursor=NULL;
    	wce.hIcon=NULL;
    	wce.hIconSm=NULL;
    	wce.hInstance=g_hinstance;
    	wce.lpfnWndProc=wndproc;
    	wce.lpszClassName=lpClassName;
    	wce.lpszMenuName=NULL;
    	wce.style=CS_HREDRAW|CS_VREDRAW;
    	ATOM atom= RegisterClassEx(&wce);
    	if(atom==0){
    		MessageBox(NULL,"注册失败","info",MB_OK);
    		return FALSE;
    	}
    	return TRUE;
    }
    //创建窗口
    HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
    {
    	HWND hwnd=CreateWindowEx(0,lpClassName,lpWndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
    		CW_USEDEFAULT,CW_USEDEFAULT,NULL,LoadMenu(g_hinstance,MAKEINTRESOURCE(IDR_MENU1)),g_hinstance,"hello create");
    	return hwnd;
    }
    //创建子窗口
    HWND CreateChild(HWND phwnd,LPSTR lpClassName,LPSTR lpWndName)
    {
    	if(Register(lpClassName,DefWindowProc)==0)
    	{
    		MessageBox(phwnd,"创建子窗口失败","info",MB_OK);
    		return NULL;
    	}
    	//子窗口风格,都要 WS_CHILD|WS_VISIBLE
    	HWND hwnd=CreateWindowEx(0,lpClassName,lpWndName,WS_CHILD|WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
    		200,200,phwnd,NULL,g_hinstance,NULL);
    	return hwnd;
    }
    //显示窗口
    void Display(HWND hwnd)
    {
    	ShowWindow(hwnd,SW_SHOW);
    	UpdateWindow(hwnd);
    }
    //处理消息
    void MSGdeal()
    {
    	MSG msg={0};
    	while(GetMessage(&msg,NULL,0,0)){
    		TranslateMessage(&msg);//翻译消息 
    		DispatchMessage(&msg);//派发给 WinProc 处理消息 
    	}
    }
    void SetExtra(HWND hwnd)
    {
    	SetClassLong(hwnd,0,301);
    	SetWindowLong(hwnd,0,401);
    }
    void GetExtra(HWND hwnd)
    {
    	long nc= GetClassLong(hwnd,0);
    	long nw=GetWindowLong(hwnd,0);
    	char txt[200]={0};
    	sprintf(txt,"%d,%d",nc,nw);
    	MessageBox(NULL,txt,"info",MB_OK);
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	AllocConsole();//调试程序方法
    	g_houtput=GetStdHandle(STD_OUTPUT_HANDLE);
    	g_hinstance=hInstance;
     	// TODO: Place code here.
    	//SysReg();
    	//AppReg();
    	if(Register("main",WinProc)==0)
    	{
    		MessageBox(NULL,"注册失败","提示",MB_OK);
    		return 0;
    	}
    	HWND hwnd= CreateMain("main","pro1");
    	//HWND hchild=CreateChild(hwnd,"child1","child1");//创建子窗口
    	//HWND hchild2=CreateChild(hwnd,"child2","child2");
    	
    	Display(hwnd);
    	//MoveWindow(hchild,300,200,200,200,TRUE);
    	//MoveWindow(hchild2,500,200,200,200,TRUE);
    	//SetExtra(hwnd);
    	//GetExtra(hwnd);
    	MSGdeal();
    	return 0;
    }
    
    
    


    第二个程序:

    菜单资源:

    主要cpp文件的代码:

    // win32app.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include <stdio.h>
    #include "resource.h"
    HINSTANCE g_hinstance=0;//全局句柄
    HANDLE g_houtput=0;
    #include <IOSTREAM>
    void OnCreate(HWND hwnd,LPARAM lparam)
    {
    	
    	HWND com1= CreateWindowEx(0,"COMBOBOX","",WS_CHILD|WS_VISIBLE|CBS_SIMPLE,
    		50,50,200,200,hwnd,(HMENU)1001,g_hinstance,0);//简单组合框
    	HWND com2= CreateWindowEx(0,"COMBOBOX","",WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWN,
    		260,50,200,200,hwnd,(HMENU)1002,g_hinstance,0);//下拉式
    	HWND com3=CreateWindowEx(0,"COMBOBOX","",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
    		470,50,200,200,hwnd,(HMENU)1003,g_hinstance,0);//下拉列表式
    	HFONT font=CreateFont(30,0,0,0,900,0,0,0,GB2312_CHARSET,0,0,0,0,"黑体");
    	SendMessage(com1,WM_SETFONT,(WPARAM)font,0);//设置字体
    }
    void OnAdd(HWND hwnd)
    {
    	HWND com1=GetDlgItem(hwnd,1001);
    	HWND com2=GetDlgItem(hwnd,1002);
    	HWND com3=GetDlgItem(hwnd,1003);
    	for(int i=0;i<30;i++)
    	{
    		char txt[100]={0};
    		sprintf(txt,"item%d",i);
    		SendMessage(com1,CB_ADDSTRING,0,(LPARAM)txt);
    		SendMessage(com2,CB_ADDSTRING,0,(LPARAM)txt);
    		SendMessage(com3,CB_ADDSTRING,0,(LPARAM)txt);
    		SendMessage(com2,CB_SETITEMDATA,i,1000+i);//设置附加数据
    	}
    }
    void oncommand(HWND hwnd,WPARAM wparam,LPARAM lparam)
    {
    	UINT id=LOWORD(wparam);
    	int result=0;
    	HWND dlg=0;
    	switch(id)
    	{
    	case ID_add:
    		OnAdd(hwnd);
    		break;
    	case ID_delete:
    		{
    			HWND com2=GetDlgItem(hwnd,1002);
    			int index=0;//SendMessage(com2,CB_GETCURSEL,0,0);
    			char* s="item1";
    			
    			index=SendMessage(com2,CB_FINDSTRING,(WPARAM)-1,(LPARAM)s);//模糊查找,返回第一个匹配的索引
    			//SendMessage(com2,CB_SELECTSTRING,(WPARAM)-1,(LPARAM)s);//模糊匹配,并设置被选择
    			if(index!=CB_ERR)
    			{
    				
    				int len=(int)SendMessage(com2,CB_GETLBTEXTLEN,(WPARAM)index,0);
    				char *a=(char *) malloc(len+1);
    				SendMessage(com2,CB_GETLBTEXT,(WPARAM)index,(LPARAM)a);//取模糊匹配的文字
    				if(strcmp(s,a)==0)//判断是否完全匹配
    				{
    					int data=SendMessage(com2,CB_GETITEMDATA,index,0);
    					char b[10]={0};
    					sprintf(b,"%d",data);
    					MessageBox(NULL,b,"info",MB_OK);
    					SendMessage(com2,CB_DELETESTRING,index,0);
    					SendMessage(com2,CB_SETCURSEL,(WPARAM)index,0);
    				}
    				free(a);
    			}
    		}
    		break;
    		case 1001:
    			{
    				if(HIWORD(wparam)==CBN_SELCHANGE)
    				{
    					HWND com1=GetDlgItem(hwnd,1001);
    					HWND com2=GetDlgItem(hwnd,1002);
    					HWND com3=GetDlgItem(hwnd,1003);
    					int index=SendMessage(com1,CB_GETCURSEL,0,0);
    					if(index!=CB_ERR)
    					{
    						SendMessage(com2,CB_SETCURSEL,index,0);
    						SendMessage(com3,CB_SETCURSEL,index,0);
    					}
    				}
    			}
    		break;
    	}
    }
    //回调函数
    LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
    {
    	switch(msg)
    	{
    	case WM_SYSCOMMAND:
    		if(wparam==SC_CLOSE){
    			/*
    			int ret=MessageBox(NULL,"是否退出","info",MB_YESNO);
    			if(ret==IDYES){
    				//下面代码会自动关闭和销毁
    				//PostQuitMessage(0);
    			}
    			else return 0;//不执行下面代码
    			*/
    		}
    		break;
    		//在创建窗口之后还未显示的时候
    	case WM_CREATE:
    		OnCreate(hwnd,lparam);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	case WM_COMMAND:
    		oncommand(hwnd,wparam,lparam);
    		break;
    
    	}
    	return DefWindowProc(hwnd,msg,wparam,lparam);
    }
    //注册窗口类
    BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
    {
    	WNDCLASSEX wce={0};
    	wce.cbSize=sizeof(wce);
    	wce.cbClsExtra=200;
    	wce.cbWndExtra=200;
    	wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    	wce.hCursor=NULL;
    	wce.hIcon=NULL;
    	wce.hIconSm=NULL;
    	wce.hInstance=g_hinstance;
    	wce.lpfnWndProc=wndproc;
    	wce.lpszClassName=lpClassName;
    	wce.lpszMenuName=NULL;
    	wce.style=CS_HREDRAW|CS_VREDRAW;
    	ATOM atom= RegisterClassEx(&wce);
    	if(atom==0){
    		MessageBox(NULL,"注册失败","info",MB_OK);
    		return FALSE;
    	}
    	return TRUE;
    }
    //创建窗口
    HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
    {
    	HWND hwnd=CreateWindowEx(0,lpClassName,lpWndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
    		CW_USEDEFAULT,CW_USEDEFAULT,NULL,LoadMenu(g_hinstance,MAKEINTRESOURCE(IDR_MENU1)),g_hinstance,"hello create");
    	return hwnd;
    }
    //创建子窗口
    HWND CreateChild(HWND phwnd,LPSTR lpClassName,LPSTR lpWndName)
    {
    	if(Register(lpClassName,DefWindowProc)==0)
    	{
    		MessageBox(phwnd,"创建子窗口失败","info",MB_OK);
    		return NULL;
    	}
    	//子窗口风格,都要 WS_CHILD|WS_VISIBLE
    	HWND hwnd=CreateWindowEx(0,lpClassName,lpWndName,WS_CHILD|WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
    		200,200,phwnd,NULL,g_hinstance,NULL);
    	return hwnd;
    }
    //显示窗口
    void Display(HWND hwnd)
    {
    	ShowWindow(hwnd,SW_SHOW);
    	UpdateWindow(hwnd);
    }
    //处理消息
    void MSGdeal()
    {
    	MSG msg={0};
    	while(GetMessage(&msg,NULL,0,0)){
    		TranslateMessage(&msg);//翻译消息 
    		DispatchMessage(&msg);//派发给 WinProc 处理消息 
    	}
    }
    void SetExtra(HWND hwnd)
    {
    	SetClassLong(hwnd,0,301);
    	SetWindowLong(hwnd,0,401);
    }
    void GetExtra(HWND hwnd)
    {
    	long nc= GetClassLong(hwnd,0);
    	long nw=GetWindowLong(hwnd,0);
    	char txt[200]={0};
    	sprintf(txt,"%d,%d",nc,nw);
    	MessageBox(NULL,txt,"info",MB_OK);
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	AllocConsole();//调试程序方法
    	g_houtput=GetStdHandle(STD_OUTPUT_HANDLE);
    	g_hinstance=hInstance;
     	// TODO: Place code here.
    	//SysReg();
    	//AppReg();
    	if(Register("main",WinProc)==0)
    	{
    		MessageBox(NULL,"注册失败","提示",MB_OK);
    		return 0;
    	}
    	HWND hwnd= CreateMain("main","pro1");
    	//HWND hchild=CreateChild(hwnd,"child1","child1");//创建子窗口
    	//HWND hchild2=CreateChild(hwnd,"child2","child2");
    	
    	Display(hwnd);
    	//MoveWindow(hchild,300,200,200,200,TRUE);
    	//MoveWindow(hchild2,500,200,200,200,TRUE);
    	//SetExtra(hwnd);
    	//GetExtra(hwnd);
    	MSGdeal();
    	return 0;
    }
    
    
    






    展开全文
  • Windows提供了一个API,GetWindowLong,通过这个函数得到HWND的原始消息处理过程函数的指针,将其保存起来,再调用SetWindowLong来设置一个新的函数指针,使这个指针指向我们自己的函数,这样,在我们的消息处理函数...

    也许你需要一个特殊的Edit来限制浮点数的输入,但是现有的Edit却并不能完成这项工作,因为它只能够单纯的限制大小写或者纯数字。当你在论坛上求救的时候,某个网友告诉你:“用子类化。”

    子类化
    在Windows中,每一个窗体都会有一个HWND;Windows提供了一个API,GetWindowLong,通过这个函数得到HWND的原始消息处理过程函数的指针,将其保存起来,再调用SetWindowLong来设置一个新的函数指针,使这个指针指向我们自己的函数,这样,在我们的消息处理函数中,只处理我们关心的消息,不关心的消息就调用其原始的指针来处理消息。

    超类化
    用GetClassInfoEx获取原有的HWND的所有信息,然后用我们自定义的窗口处理过程取代原有的窗口过程 用我们自定义的类名比如“HexEdit”取代原有的类名“Edit” 然后用RegisterClassEx向windows注册我们的新类;

    可以用函数指针的办法,将我们感兴趣的消息拦截下来,处理完之后再让预定义的窗口过程处理。这个过程大致如下: 
    WNDPROC OldProc; 
    OldProc = (WNDPROC)SetWindowsLong(hWnd, GWL_WNDPROC, (LONG)NewProc); 
    当然,这里的新窗口过程NewProc是预先由你实现好的。上述代码执行以后,系统在处理hWnd的窗口消息时,就会先进入你实现的NewProc回调过程,然后在处理过你感兴趣的消息之后,通过CallWindowProc函数和你预先保存的OldProc再次回到原来的回调过程中完成剩余的工作。 

    子类化是win32层面的概念;如果是C#这类语言的话,可以不用管;都已经封装到事件里面了;

    从win32的程序来看,就是有一个主窗口过程,在里面处理主窗口的各种消息,子窗口控件的消息一般也在此处理;如果某个子窗口控件需要单独处理Windows消息来实现更强功能,就再为这个子窗口控件设置一个窗口过程,在此处理此子窗口控件的消息;

    子类化的win32程序结构如下;

    #include <windows.h>

    LRESULT CALLBACK WndProc    (HWND, UINT, WPARAM, LPARAM) ;
    LRESULT CALLBACK ScrollProc (HWND, UINT, WPARAM, LPARAM) ;

    WNDPROC OldScroll ;

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         ...变量定义,注册窗口类,创建窗口显示窗口,消息循环...
    }

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        ...变量定义...
         
         switch (message)
         {
         case WM_CREATE :
              hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
              hwndScroll = CreateWindow (TEXT ("scrollbar"), NULL,
                                                 WS_CHILD | WS_VISIBLE | 
                                                 WS_TABSTOP | SBS_VERT,
                                                 0, 0, 0, 0, 
                                                 hwnd, (HMENU) i, hInstance, NULL) ;
              ......
                   
              OldScroll = (WNDPROC) SetWindowLong (hwndScroll, 
                                                 GWL_WNDPROC, (LONG) ScrollProc) ;
              ......
              }

              return 0 ;
              
         case WM_SIZE :
              ......
              return 0 ;
              
         case WM_VSCROLL :
              i = GetWindowLong ((HWND) lParam, GWL_ID) ;
              
              switch (LOWORD (wParam))
              {
              case SB_PAGEDOWN :
              ......
              }

              return 0 ;          
                  
         case WM_SYSCOLORCHANGE :
             ......
                   
         case WM_DESTROY :
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
         
    LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message, 
                                 WPARAM wParam, LPARAM lParam)
    {
         int id = GetWindowLong (hwnd, GWL_ID) ;
              
         switch (message)
         {
         case WM_KEYDOWN :
         ......
         case WM_SETFOCUS :
         ......
         }
         return CallWindowProc (OldScroll[id], hwnd, message, wParam, lParam) ;
    }

        它定义了2个窗口过程;主窗口过程WndProc,滚动条控件的窗口过程ScrollProc;在主窗口中创建滚动条控件,也处理滚动条消息WM_VSCROLL;再用SetWindowLong为滚动条控件设置一个窗口过程名为ScrollProc,在这里面滚动条处理自己的键按下等等消息;主窗口的键按下消息由主窗口过程处理;

    展开全文
  • Windows,C++编程创建窗口的过程详解

    万次阅读 2015-07-10 17:31:55
    WindowsC++编程,创建窗口的是个步骤详解
  • 好久没玩玩编程了,这次回坑中~之前把自己常用到的命令写成了一个库,发现局限性太大了~ 只能用在MFC当中,现在改改,争取写一个通用点的,看看能写成什么鬼样子.开始记录自己给自己挖坑的轨迹. 可能是小事,小bug,也给...
  • C++Windows编程之回调机制

    千次阅读 2014-12-24 20:21:14
     C++Windows编程之创建窗口  C++Windows编程之消息循环和消息结构   前面已经讲过,最基本的Windows应用由两部分组成:入口函数WinMain和窗口处理函数。窗口处理函数的函数名由程序员自己定义。不过,由于它是...
  •  // 显示窗口,刷新窗口客户区  ::ShowWindow(hwnd, nCmdShow);  ::UpdateWindow(hwnd);  // 从消息队列中取出消息,交给窗口函数处理,直到 GetMessage 返回 FALSE,结束消息循环  MSG msg;  while...
  • 创建一个windows窗口,再在内存中构建一个buffer,做一些我们自己定义的rendering并且在窗口中展示buffer。 现在的游戏都是让显卡做rendering,但是要我们自己做rendering,必须先做一些自己的东西,然后在展示出来...
  • C++是一门语言,做为一个windows编程的新手,用C++windows API 函数来编写windows程序,如果达到足够熟练的情况下就可以用C++自己编写类似windows API 这样的函数C++是一门纯语言,本身没有什么功能,只是提供了基本...
  • 现在要创建一个子窗口,要求始终在父窗口前面(独立的,非MDI),在不关闭子窗口的时候不能操作父窗口。 可实际上子窗口不关闭同样可以激活父窗口。 子窗口始终在父窗口前面,但同时也可以操作父窗口。 请教如何实现...
  • 本节介绍Windows编程中使用的一些基本术语和编码约定。 在这个部分 准备你的开发环境 Windows编码约定 使用字符串 什么是窗口? WinMain:应用程序入口点 相关话题 学习用C++编写Windows程序 模块1.您的第一个...
  • 可视化操作创建的菜单,加载到窗口。 方法1:注册时指定菜单 wce.lpszMenuName=MAKEINTRESOURCE(IDR_MENUMAIN);//数字形式的资源ID转换为字符串形式的资源 方法2: //创建窗口时加载菜单资源 HMENU menumain= ...
  • 因为只有一个winmain函数,系统分配给winmain只有一个HINSTANCE参数,程序中通过CreateWindowExW来创建了一个窗口A,现在需要将窗口A关闭,同时打开一个新的窗口与B,请问该如何完成? 因为只有一个HINSTANCE,...
  • 一个在Dev-C++中写的非可视化编程windows窗口计算器简易版,其运行效果如下图: 所有框架和单目运算已经做好,+-*/暂未完成,代码还有改进空间...... #include <iostream> #include <iomanip> #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,173
精华内容 469
关键字:

c++windows窗口编程

c++ 订阅