子窗口控件(2)之消息处理

通知码进一步给出每条消息的意思,下面是按钮的通知码的可能值。

按钮通知码标识符 值 
BN_CLICKED 0
BN_PAINT 1
BN_HILITE或BN_PUSHED 2
BN_DISABLE 3
BN_DISABLE 4
BN_DOUBLECLICKED或BN_DBLCLK 5

BN_SETFOCUS

6
BN_KILLFOCUS 7

每个子窗口有一个句柄和唯一的ID,知道其中一个就可以找到另一个,如果知道了子窗口句柄,可以通过一下函数获取ID

id=GetWindowLong(hwndChlid,GWL_ID);


也可以使用另一个函数

id=GetDlgCtrlID(hwndChild);


知道子窗口ID和父窗口句柄,可以得到子窗口句柄

hwndChild=GetDlgItem(hwndParend,id);


通过给Windows发送一个BM_GETSTATE消息,可以模拟按键按钮的状态变化,下面的语句可以让按钮看上去像按下去一样

SendMessage(hwndButton,BM_SETSTATE,1,0);//按下去的效果
SendMessage(hwndButton,BM_SETSTATE,0,0);//正常状况


复选框:

在处理来自控件的WM_COMMAND消息时,可以使用下面的代码切换选中标记

SendMessage((HWND)lParam,MB_SETCHECK,(WPARAM)!SendMessage((HWND)lParam,BM_GETCHECK,0,0),0);
iCheck=(int)SendMessage(hwndButton,BM_GETCHECK,0,0);//选中返回非0

 

单选按钮:

SendMessage(hwndButton,BM_SETCHECK,1,0);//选中
SendMessage(hwndButton,BM_SETCHECK,0,0);//未选中

 

改变按钮文本:

SetWindowText(hwnd,pszString);

iLength=GetWindowText(hwnd,pszBuffer,iMaxLength);
iLength=GetWindowLength(hwnd);


可见的按钮和启动的按钮

如果在创建窗口类是没有包括WS_VISIBLE,子窗口将不会显示,除非使用了下面的语句:

ShowWindow(hwndChild,SW_SHOWNORMAL);

IsWindowVisible(hwndChild);//判断是否可见


可以使用下面语句禁止和重启按钮

EnableWindow(hwndChild,FALSE);//按钮不可用,按钮变成灰色
Enablewindow(hwndChild,TRUE);//按钮可用

 

下面来看看一段完整的程序:

#include<windows.h>
#include<windowsx.h>

LRESULT CALLBACK WindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

HINSTANCE hInst;
int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
	static TCHAR szAppName[]=TEXT("leidemingzi");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;

	hInst=hInstance;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=WindowProc;
	wndclass.lpszClassName=szAppName;
	wndclass.lpszMenuName=NULL;
	wndclass.style=CS_HREDRAW|CS_VREDRAW;

	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("The program require window nt"),TEXT("TIPS"),MB_ICONERROR);
		return 0;
	}

	hwnd=CreateWindow(
	  szAppName,  // registered class name
	  TEXT("this is title"), // window name
	  WS_OVERLAPPEDWINDOW,        // window style
	  CW_USEDEFAULT,                // horizontal position of window
	  CW_USEDEFAULT,                // vertical position of window
	  CW_USEDEFAULT,           // window width
	  CW_USEDEFAULT,          // window height
	  NULL,      // handle to parent or owner window
	  NULL,          // menu handle or child identifier
	  hInstance,  // handle to application instance
	  NULL        // window-creation data
);

	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
	
}

LRESULT CALLBACK WindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
	static HWND m_hEditWnd;
	static HWND m_hButton;
	static int nButtonID=1;
	switch(uMsg)
	{

	case WM_CREATE:
		m_hEditWnd=CreateWindow(
				TEXT("EDIT"),TEXT(""),WS_CHILD|WS_VISIBLE|ES_MULTILINE|WS_VSCROLL|WS_BORDER,0,0,0,0,hwnd,NULL,hInst,NULL
			);

		m_hButton=CreateWindow(
				TEXT("BUTTON"),TEXT("按钮"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,0,0,hwnd,(HMENU)nButtonID,hInst,NULL
			);

		SetWindowText(m_hEditWnd,TEXT("win32 application programing"));
		break;

	case WM_SIZE:
		MoveWindow(m_hEditWnd,0,0,200,100,TRUE);

		MoveWindow(m_hButton,140,110,60,20,TRUE);

		break;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
		
	case WM_KEYDOWN:
		switch(wParam)
		{
		case VK_ESCAPE:
			PostQuitMessage(0);
			break;
		}
		break;

	case WM_COMMAND:
		if(wParam==nButtonID)
		{
			TCHAR szBuffer[100];

			GetWindowText(m_hEditWnd,szBuffer,98);

			MessageBox(hwnd,szBuffer,TEXT("Edit Content"),MB_OK);
		}

	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);



}

结果如下:

子窗口控件(2)之消息处理_第1张图片



你可能感兴趣的:(command,null,application,callback,button,winapi)