通知码进一步给出每条消息的意思,下面是按钮的通知码的可能值。
按钮通知码标识符 | 值 |
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);
}
结果如下: