win32学习记录-day09

普通窗口和对话框窗口的区别

普通窗口 - 自定义 调用 缺省函数
WndProc(...)
{
......
DefWindowProc(...);
}

对话框窗口 - 缺省调用自定义

对话框窗口

  1. 对话框的分类
  • 模式对话框 - 当对话框显示时,会禁止本进程的其他窗口的输入等用户交互操作。
  • 无模式对话框 - 在对话框显示后,其他窗口同样可以接收输入等用户交互操作。
  1. 对话框基本使用

    1. 对话框窗口处理函数(操作系统提供,因为对话框窗口类是操作系统注册的,处理函数由其负责,谁注册窗口类谁负责编写处理函数)
    2. 注册窗口类(可选,基本不使用)
    3. 创建对话框
    4. 对话框的关闭
  2. 模式对话框的使用

    1. 对话框窗口处理函数(并非真正对话框处理函数)
    INT CALLBACK DialogProc(
    	HWND hwndDlg,  //对话框窗口句柄
    	UINT uMsg,     //消息ID
    	WPARAM wParam, //消息参数
    	LPARAM lParam  //消息参数
    );
    
     返回TRUE - 表示DialogProc函数中处理了这个消息,缺省处理函数不需要处理。
     返回FALSE- 表示DialogProc函数未处理这个消息,交给缺省处理函数处理。
     不需要调用缺省对话框窗口处理函数。
    
    1. 创建对话框(创建模式对话框函数DialogBox())
    	INT DialogBox(
    	    HINSTANCE hInstance,//应用程序实例句柄
    	    LPCTSTR lpTemplate, //对话框模板资源ID
    	    HWND hWndParent, //对话框父窗口
    	    DLGPROC lpDialogFunc //自己定义的处理函数名
    	);		
    
     需要添加对话框资源。	
     DialogBox是一个阻塞函数,只有当对话框关闭后,
     才会返回,继续执行后续代码。
     返回值是通过EndDialog()函数设置。一是让对话框销毁,二就是让DialogBox()函数返回什么
    
    1. 对话框的关闭
    BOOL EndDialog(
    	  HWND hDlg,//关闭的对话框窗口句柄
    	  INT nResult //关闭的返回值
    );
    
     关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow等函数。
     nResult是DialogBox函数退出时的返回值。
    
    1. 对话框的消息
      WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作。
  3. 无模式对话框

    1. 对话框窗口处理函数 DialogProc(并非真正的对话框处理函数)
    2. 创建对话框
    HWND CreateDialog(
    	HINSTANCE hInstance,  //应用程序实例句柄
    	 LPCTSTR lpTemplate,   //模板资源ID
    	 HWND hWndParent,      //父窗口
    	 DLGPROC lpDialogFunc  //自己定义的函数
    );
    
     非阻塞函数,创建成功返回窗口句柄,需要使用ShowWindow函数显示对话框。
    
    1. 对话框的关闭
      关闭时使用DestroyWindow销毁窗口,不能使用EndDialog关闭对话框。
    2. 对话框的消息
      WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作。
  4. 对话框VS普通窗口(区别)

    1. 创建
      模式对话框 - DialogBox,阻塞函数
      无模式对话框 - CreateDialog
      普通窗口 - CreateWindow/Ex
    2. 窗口处理函数
      对话框 – DialogProc(并非真正对话框处理函数,被系统处理函数调用)
      普通窗口 - WindowProc,需要调用缺省窗口处理函数
    3. 窗口消息
      普通窗口 - WM_CREATE
      对话框 - WM_INITDIALOG
    4. 窗口销毁
      模式对话框 - EndDialog
      无模式对话框/普通窗口 - DestroyWindow

子控件

  • 子控件
    • 系统已经定义窗口类型,相应窗口的处理函数等
    • 都已经由系统完成。例如 编辑框、按钮等等。
  • 子控件的创建
    • 不需要注册,直接使用CreateWindow/Ex
      创建该类的窗口。子控件创建时,每个控件
      都具有一个ID号。
  • 控件的消息
    • 程序和子控件之间交互,都是通过消息完成。
    • 控件的窗口消息 - 程序可以使用SendMessage向控件发送消息,获取控件的信息或设置控件。
    • 控件的通知消息 - 控件有相应的事件发生后,会向所在的父窗口(处理函数)发送通知消息(WM_COMMAND),父窗口可以根据通知消息的ID,做相应的处理。

静态框

  • 静态框相关
    • 常用于显示文字和图标等。窗口类名称“STATIC”。
      • 文字静态框 - 显示文字
      • 图标静态框 - 显示图标,设置SS_ICON/SS_BITMAP
  • 静态框的使用
  1. 创建
    CreateWindow/ CreateWindowEx
    风格
    图标静态框 使用 SS_ICON/SS_BITMAP 风格
    如果创建 图标静态框,那么窗口的名称要设置成 图标ID
    例如:CreateWindowEx( 0, "STATIC", "#101"...... );

  2. 窗口消息
    SendMessage发送到控件即可。例如:STM_SETICON

  3. 通知消息(STN_CLICKED)
    需要在创建时增加SS_NOTIFY风格。
    通知消息WM_COMMAND 消息

    附:WM_COMMAND
           WPARAM:
    		LOWORD - 菜单项、加速键、控件的ID
    		HIWORD - 对于菜单项,为0
    			      对于加速键,为1
    			      对于控件,是Notify-Code(通知码,表示控件发生了什么事)
    	LPARAM:
    		对于菜单项、加速键为NULL
    		对于控件,为控件窗口句柄
    
     ```
     SendMessage( 
     (HWND) hWnd, // handle to destination window STM_SETICON, // message to send 
     (WPARAM) wParam, // handle to icon (HICON) 
     (LPARAM) lParam // not used; must be zero
      );
     ```
     根据父窗口的句柄和控件的ID获取控件的句柄
     ```
     HWND GetDlgItem( 
           HWND hDlg, // handle to dialog box 
           int nIDDlgItem // control identifier 
     );
     ```
    

按钮相关

  • 根据按钮的风格,将按钮分成4类
    1. 下压式按钮:BS_PUSHBUTTON/BS_DEFPUSHBUTTON
    2. 分组框:BS_GROUPBOX
    3. 复选框:
      BS_CHECKBOX/BS_AUTOCHECKBOX
      BS_3STATE/BS_AUTO3STATE
    4. 单选框:BS_RADIOBUTTON/BS_AUTORADIOBUTTON
      窗口类名称 BUTTON
  • 下压式按钮
    1 创建按钮
    2. 窗口消息
    3. 通知消息 (BN_CLICKED)
  • 分组框
    常用于界面上的控件分组显示,提高界面友好性。
  • 复选框
  1. 风格和创建
    BS_CHECKBOX - 点击选择时,需要自己维护选择状态
    BS_AUTOCHECKBOX - 点击选择时,系统自动维护选择状态

  2. 窗口消息

    • 获取和设置选择状态
      • BM_SETCHECK:wParam-具体要设置的状态,lParam - 不使用必须为0
        *BM_GETCHECK:wParam/lParam-都不使用必须为0,当前状态通过SendMessage函数的返回值获取。
      • HWND hCheck = GetDlgItem(hWnd, 1005);
      • LRESULT nRet = SendMessage(hCheck, BM_GETCHECK, 0, 0);
  3. 通知消息
    BN_CLICKED 按钮被点击

     ```
     void OnCommand(HWND hWnd, WPARAM wParam)
     {
           	switch (LOWORD(wParam))
     	      {case 1005:
     		              if (HIWORD(wParam) == BN_CLICKED)
                  		{	     HWND hCheck = GetDlgItem(hWnd, 1005);
     			                   LRESULT nRet = SendMessage(hCheck, BM_GETCHECK, 0, 0);
     			                   if (nRet == BST_CHECKED)
     			                   {SendMessage(hCheck, BM_SETCHECK, BST_INDETERMINATE, 0);
     		                   	}else if (nRet == BST_INDETERMINATE)
     			                   {		SendMessage(hCheck, BM_SETCHECK, BST_UNCHECKED, 0);
     			                   }else{	SendMessage(hCheck, BM_SETCHECK, BST_CHECKED, 0);}
                    }
     	        	break;
     	        case 1003:
     		        if (HIWORD(wParam) == BN_CLICKED)
     		        {        	HWND hCheck = GetDlgItem(hWnd, 1003);
     		                 	LRESULT nRet = SendMessage(hCheck, BM_GETCHECK, 0, 0);
     			                 if (nRet == BST_CHECKED)
     			                 {SendMessage(hCheck, BM_SETCHECK, BST_UNCHECKED, 0);
     			                 }else{		SendMessage(hCheck, BM_SETCHECK, BST_CHECKED, 0);}
     		        }
     		        break;
     	        case 1001:
     		        if (HIWORD(wParam) == BN_CLICKED)
     		        {	MessageBox(hWnd, "点了OK", "Infor", MB_OK);
     		}
     		break;
     	}
     }
     ```
    
  • 单选按钮
  1. 风格和创建
    BS_RADIOBUTTON - 自己维护状态
    BS_AUTORADIOBUTTON - 系统自动维护状态

  2. 窗口消息
    获取和设置选择状态
    BM_SETCHECK
    BM_GETCHECK
    每组单选框中只能同时有1个被选择。

  3. 通知消息
    BN_CLICKED

  4. 其他
    单选框分组,可以使用WS_GROUP风格分组。
    从当前具有WS_GROUP风格的单选框,到下一个WS_GROUP风格单选框之前,为1组单选框

    • 下压式按钮(多态按钮)
      CreateWindowEx(0, "BUTTON", "多态按钮", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE, 50, 380, 200, 20, hWnd, (HMENU)1011, g_hInstance, NULL);
      当复选框对待操作

    • 单选框,可用作播放器的按钮
      CreateWindowEx(0, "BUTTON", "多态按钮", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|BS_PUSHLIKE, 50, 380, 200, 20, hWnd, (HMENU)1011, g_hInstance, NULL);

编辑框

  1. 编辑框相关
    从风格可以将编辑框分成几类:
    单行编辑框 - 只能处理一行文字
    多行编辑框 - 可以显示多行文字
    密码编辑框 - 密码输入 ES_PASSWORD---只适合单行编辑框
    数字编辑框---ES_NUMBER---只能输入数字
    ...在MSDN中输入Edit Styles进行查询
  2. 编辑框的使用
    1. 创建
      窗口类名称 EDIT
    2. 窗口消息
      WM_GETTEXT / WM_SETTEXT / WM_GETTEXTLENGTH
    3. 通知消息
      EN_CHANGE 当编辑框内的文字被修改,通知父窗口。被存入COMMAND中的wParam的高两个字节
设置编辑框的文本内容----WM_SETTEXT
SendMessage( 
    (HWND) hWnd, // 编辑框句柄 
    WM_SETTEXT, // 消息类型 
    (WPARAM) wParam, // 没用,必须置0
    (LPARAM) lParam // 准备设置编辑框的文本内容的缓冲区的首地址
);
获取编辑框的文本内容----WM_GETTEXT
SendMessage( 
    (HWND) hWnd, // 
    WM_GETTEXT, // message to send 
    (WPARAM) wParam, // 自己开设的缓冲区的大小
    (LPARAM) lParam // 缓冲区的首地址 
);
获取编辑框文本内容的长度---WM_GETTEXTLENGTH
SendMessage( 
    (HWND) hWnd, // 编辑框句柄
    WM_GETTEXTLENGTH, // message to send 
    (WPARAM) wParam, // 必须置0
    (LPARAM) lParam // 必须置0
);
编辑框文本内容长度通过SendMessage()函数的返回值获取
设置编辑框文本内容的字体----WM_SETFONT
SendMessage( 
(HWND) hWnd, // handle to destination window WM_SETFONT, // message to send 
(WPARAM) wParam, // handle to font 
(LPARAM) lParam // redraw option 
);
设置编辑框文本内容的颜色
当一个窗口需要重绘的时候,该控件就会向父窗口发送WM_CTLCOLOREDIT,并右我们在父窗口的处理函数进行实现
LRESULT CALLBACK WindowProc( 
    HWND hwnd, // handle to window 
    UINT uMsg, // WM_CTLCOLOREDIT 
    WPARAM wParam, // 系统吧控件的绘图设备(HDC)句柄通过wParam传给父窗口的处理函数 
    LPARAM lParam // handle to static control (HWND) 
);
	HWND hEdit = GetDlgItem(hWnd, 1001);
BOOL MoveWindow( 
     HWND hWnd, // handle to window 
     int X, // horizontal position 
     int Y, // vertical position
     int nWidth, // width 
     int nHeight, // height 
     BOOL bRepaint // repaint option
    );
posted @ 2016-10-23 22:36  呉语伦比  阅读(188)  评论(0编辑  收藏  举报