12 Windows编程——子窗口和系统内置窗口类“BUTTON”
创建子窗口类,使得子窗口有自己的处理过程。
子窗口类型WS_CHILD不能和WS_POPUP一起使用!
为什么子窗口要有自己的处理过程?
如果使用主窗口类来创建子窗口,那么子窗口和主窗口将公用窗口处理过程,此时,窗口处理过程在进行消息处理的时候,必须判断是哪个窗口的消息,非常不方便。
子窗口必须有自己的窗口类型WSCHILD,并且子窗口的父窗口句柄一定不能使NULL,子窗口的坐标主窗口的映射方式和客户区有关。否则CreateWindow函数就会失败。
客户定制消息:WL_USER+N,其中N可以是0x7FFF-WM_USER之间的任何值。发送窗口消息的函数:
SendMessage
LRESULT WINAPI SendMessage(
_In_ HWND hWnd,
_In_ UINT Msg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。和函数PostMessage不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。
hWnd: 发送消息的目标窗口;
Msg: WMXXX消息;
wParam: 用户自定义的一个32位值;
1param: 用户自定义的一个32为值;
设置当前的背景色
COLORREF SetBkColor( HDC hdc, COLORREF color );
用指定的颜色值来设置当前的背景色,如果指定的颜色值超出了当前设备的表示范围,则设置为最近似的、设备可以表示的颜色。
hdc:设置上下文句柄
color:标识新的背景颜色值。如果想要获得COLORREF的值,请使用RGB宏。
改变窗口位置
BOOL WINAPI SetWindowPos( _In_ HWND hWnd, _In_opt_ HWND hWndInsertAfter, _In_ int X, _In_ int Y, _In_ int cx, _In_ int cy, _In_ UINT uFlags );
改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。
hwnd:在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄
hWndlnsertAfter:用于标识在z-顺序的此 CWnd 对象之前的 CWnd 对象。如果uFlags参数中设置了SWP_NOZORDER标记则本参数将被忽略。可为下列值之一:
-
-
HWND_BOTTOM:值为1,将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
-
HWND_NOTOPMOST:值为-2,将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
-
HWND_TOP:值为0,将窗口置于Z序的顶部。
-
HWND_TOPMOST:值为-1,将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。
-
X:以客户坐标指定窗口新位置的左边界。
Y:以客户坐标指定窗口新位置的顶边界。
cx:以像素指定窗口的新的宽度。
cy:以像素指定窗口的新的高度。
uFlags:窗口尺寸和定位的标志。
改变指定窗口的属性
LONG WINAPI SetWindowLong( _In_ HWND hWnd, _In_ int nIndex, _In_ LONG dwNewLong );
hwnd: 窗口句柄;
nIndex: 要改变窗口的那个参数;
dwNewLong: 窗口参数的新值;
获取窗口类信息
BOOL WINAPI GetClassInfo(
_In_opt_ HINSTANCE hInstance,
_In_ LPCTSTR lpClassName,
_Out_ LPWNDCLASS lpWndClass
);
hInstance: 当前程序的基地址,也就是程序的句柄;
1pclassName: 类名;
1pwndclass: 指向 WNDCLASS类型的指针;
画矩形
BOOL Rectangle( HDC hdc, int left, int top, int right, int bottom );
画一个矩形,可以用当前的画笔画矩形轮廓,用当前画刷进行填充。
hdc: 设备环境句柄。
left: 指定矩形左上角的逻辑X坐标。
top: 指定矩形左上角的逻辑Y坐标。
right: 指定矩形右下角的逻辑X坐标。
bottom: 指定矩形右下角的逻辑Y坐标。
返回值:如果函数调用成功,返回值非零,否则返回值为0
获得当前程序基地址,或者HINSTANCE的函数:GetModuleHandle(NULL);
系统内置的窗口类型“BUTTON”
WL_COMMAND消息:
wParam:
lparam:
不使用子窗口类创建一个按钮,点击按钮按钮会变色,源码
1 //#define _AFXDLL 2 //#include<afx.h> 3 #include<Windows.h> 4 #include<tchar.h> 5 6 #ifndef _AFXDELL 7 #define TRACE(a,b) 8 #endif 9 10 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 11 12 int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow) 13 { 14 WNDCLASS WndClass; 15 TCHAR* ClassName = TEXT("MyClass"); 16 HWND hwnd; 17 MSG msg; 18 HBRUSH hBrush; 19 20 hBrush = CreateSolidBrush(RGB(85,85,16)); 21 WndClass.cbClsExtra = 0; 22 WndClass.cbWndExtra = 0; 23 WndClass.hbrBackground = hBrush; 24 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 25 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 26 WndClass.hInstance = hInst; 27 WndClass.lpfnWndProc = WindProc; 28 WndClass.lpszClassName = ClassName; 29 WndClass.lpszMenuName = NULL; 30 WndClass.style = CS_VREDRAW | CS_HREDRAW; 31 32 RegisterClass(&WndClass); 33 hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, NULL, NULL, hInst, NULL); 34 ShowWindow(hwnd, nShow); 35 UpdateWindow(hwnd); 36 37 while (GetMessage(&msg, NULL, 0, 0)) 38 { 39 TranslateMessage(&msg); 40 DispatchMessage(&msg); 41 } 42 return 0; 43 } 44 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 45 { 46 HDC hdc; 47 PAINTSTRUCT pt; 48 HBRUSH hBrush; 49 static int status; 50 switch (message) 51 { 52 case WM_CREATE: 53 return 0; 54 case WM_SIZE: 55 return 0; 56 case WM_PAINT: 57 hdc = BeginPaint(hwnd, &pt); 58 if(status == 0) 59 { 60 hBrush = CreateSolidBrush(RGB(200, 200, 200)); 61 SelectObject(hdc, hBrush); 62 Rectangle(hdc, 200, 100, 300, 125); 63 SetBkColor(hdc, RGB(200, 200, 200)); 64 TextOut(hdc, 240, 108, TEXT("OK"), 2); 65 TextOut(hdc, 0, 0, TEXT("Hit me!"), 7); 66 } 67 else 68 { 69 hBrush = CreateSolidBrush(RGB(0, 200, 200)); 70 SelectObject(hdc, hBrush); 71 Rectangle(hdc, 200, 100, 300, 125); 72 SetBkColor(hdc, RGB(0, 200, 200)); 73 TextOut(hdc, 240, 108, TEXT("OK"), 2); 74 TextOut(hdc, 0, 0, TEXT("Hit me!"), 7); 75 } 76 EndPaint(hwnd, &pt); 77 return 0; 78 case WM_LBUTTONDOWN: 79 if (LOWORD(lParam)>200 && LOWORD(lParam)<300 && HIWORD(lParam)<125 && HIWORD(lParam)>100) 80 { 81 status = 1; 82 InvalidateRect(hwnd, NULL,TRUE); 83 } 84 return 0; 85 case WM_LBUTTONUP: 86 InvalidateRect(hwnd, NULL,TRUE); 87 status = 0; 88 return 0; 89 case WM_DESTROY: 90 PostQuitMessage(0); 91 return 0; 92 default: 93 break; 94 } 95 96 return DefWindowProc(hwnd, message, wParam, lParam); 97 }
使用子窗口创建按钮
1 1.h 2 //#pragma once 3 //#define _AFXDLL 4 //#include<afx.h> 5 #include<Windows.h> 6 #include<tchar.h> 7 8 #ifndef _AFXDELL 9 #define TRACE(a,b) 10 #endif 11 12 HWND CreateChild(HWND ParentHwnd, int x, int y, int cx, int cy); 13 extern HINSTANCE G_hInst;