#include <windows.h>
struct
{
int iStyle ;
TCHAR * szText ;
}button[] ={
BS_PUSHBUTTON, TEXT ("PUSHBUTTON"),
BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"),
BS_CHECKBOX, TEXT ("CHECKBOX"),
BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"),
BS_RADIOBUTTON, TEXT ("RADIOBUTTON"),
BS_3STATE, TEXT ("3STATE"),
BS_AUTO3STATE, TEXT ("AUTO3STATE"),
BS_GROUPBOX, TEXT ("GROUPBOX"),
BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"),
BS_OWNERDRAW, TEXT ("OWNERDRAW")
} ;
#define ID_TIMER 1
#define NUM (sizeof button / sizeof button[0])
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("BtnLook") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof(hwnd) ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Button Look"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
static HWND hwndButton[NUM] ;
static RECT rect ;
static TCHAR szTop[] = TEXT ("message wParam lParam"),
szUnd[] = TEXT ("_______ ______ ______"),
szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
szBuffer[50] ;
static int cxChar, cyChar ;
HDC hdc ;
PAINTSTRUCT ps ;
int i ;
switch(message)
{
case WM_CREATE:
{
cxChar = LOWORD(GetDialogBaseUnits());
cyChar = HIWORD(GetDialogBaseUnits());
for(i = 0 ; i< NUM ; i++)
{
hwndButton[i] = CreateWindow(TEXT("Button"),
button[i].szText,
WS_CHILD | WS_VISIBLE | button[i].iStyle,
cxChar * 2,cyChar * (1 + 2 * i),
cxChar * 20 , 7 * cyChar / 4,
hwnd,(HMENU) i , //每个ID都是唯一的。
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),
NULL); // 创建子窗口,创建窗口后我们不必对窗口做任何的事,有windows来
//维护,windows在父窗口销毁时,销毁子窗口。
}
SetTimer(hwnd,ID_TIMER,1000,NULL);
return 0;
}
case WM_SIZE:
{
GetWindowRect(hwnd,&rect);
rect.left = 24 * cxChar;
rect.top = cyChar ;
rect.right = LOWORD(lParam) ;
rect.bottom = HIWORD(lParam) ;
return 0 ;
}
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
TextOut(hdc,30 * cxChar,cyChar * 2,szTop,sizeof(szTop) - 1);
TextOut(hdc,30 * cxChar,cyChar * 4,szUnd,sizeof(szUnd) - 1);
EndPaint(hwnd,&ps);
return 0;
}
case WM_TIMER:
{
SendMessage(hwndButton[4],BM_SETCHECK,1,0);
return 0 ;
}
case WM_COMMAND: //当按钮按下时 子窗口向父窗口发送该信息。
{
ScrollWindow(hwnd,0,cyChar,&rect,&rect);
hdc =GetDC(hwnd);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,30 * cxChar,
10 * cyChar,szBuffer,
wsprintf(szBuffer,szFormat,
"WM_CONNNED",HIWORD(wParam),
LOWORD(wParam),HIWORD(lParam),
LOWORD(lParam)));
ReleaseDC(hwnd,hdc);
return 0;
}
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
不是小记的小记:
1.子视窗向父视窗发送消息:
WM_COMMONED::wParam , : ID ,BN_CLCKED ;lParam :hwnd。
2.父视窗向子视窗发送消息:
BM_GETCHECK
BM_SETCHECK
BM_SETSTATE
SendMessage(hwndButton[i] , BM_SETCHECK , 1 , 0);
3.获得子视窗ID or hwnds:
GetWindowLong(hwndChild , GWL_ID);
GetDlgCtrlID(hwndChild);
hwndChild = GetDlgItem( hwndParent , id );
4.改变按钮文本:
SetWindowText();
iLength = GetWindowText(hwnd);
GetWindowText(hwnd, pszBuffer , iMaxLength);
5.按钮可见 or 隐藏
ShowWindow();
IsWindowVisible( hwnd);
IsWindowEnable( );
EnableWindow( );
2012/7/26