
创建一个完整窗体要经历的步骤: 1)设计一个窗口类; 2)注册窗口类; 3)创建窗口; 4)显示及更新窗口。 第一步: windows 已经为用户定义了一个完整的窗口类,用户只需要将各个属性填满既可以。窗口类是一个 结构体,其定义如下: typedef struct _WNDCLASS{ UINT style;//class style WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; }WNDCLASS;
第二步: 用RegisterClass(&wndclass)来定义的窗口注册。
第三步:创建窗口 1)定义一个句柄,然后用CreateWindow()来为句柄赋值。函数用法参看MSDN。创建窗口必须依据已经声明并且已经注册的窗口类型来创建。 HWND CreateWindow( LPCTSTR lpClassName,//定义的窗口类名 LPCTSTR lpWindowName,//窗口的名字,将会在标题栏上显示出来的 DWORD dwStyle,//窗口的风格(窗口的外观模式和功能按钮等等) int x,//窗口初始位置ws_usedefault int y,//同上 int nWidth,//窗口的宽度,可以用ws_usedefault int nHeight,//窗口高度,可以用ws_usedefault HWND hWndParent,//父窗口的句柄,单一窗口则设置为空 HMENU hMenu,//菜单的句柄,如果没有菜单则将这个句柄设置为空 HINSTANCE hInstance,//由系统进行分配标识 LPVOID lpParam//一般设置为空 );
第四步:显示窗口 调用ShowWindow()函数来显示窗口。 ShowWindow( HWND hWnd,//要显示的窗口的句柄 int nCmdShow//显示窗口的模式,如:最大化最小花显示 )
第五步:更新窗口 在显示窗口的函数调用完毕以后调用UpdateWindow()来对窗体进行更新 UpdateWindow(hwnd);//这个函数没有并不影响消息产生。 //消息循环 MSG msg;//定义了一个消息结构体变量 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } /* GetMessage( LPMSG lpMsg, //消息结构提的指针,无需对这个消息结构提的内部成员初始化, //这个只需将定义的结构体的地址传到这里 HWND hWnd, //窗口句柄,指明要获得的是那个窗口的消息,如果要获取所有窗口的消息则 //定义为NULL UINT wMsgFilterMin, //用来指定要从消息队列里边取得的最小值, UINT wMsgFilterMax //用来指定要从消息队列里边取得的最大值, /////////////////////////////////////////////////////////////////////// //这两个参数用来限制GETMESSAGE 在消息队列里边的取值范围,// //以去处调一些确定不感兴趣的消息 // //if要从消息队列中所有的消息中提取的话则两个参数均设定为 // //零 // /////////////////////////////////////////////////////////////////////// );//从调用程序线程消息队列中取消息 */ 有了创建窗口的整个流程以后,现在就开始定义窗口过程,用WindowProc() LRESULT CALLBACK WindowProc(/*函数名字可以更改,但是参数不允许改变*/ HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );//参数和消息结构提的前四个参数相同,事实上系统在调用窗口过程函数 //的时候自动将消息结构体的前四个参数传递到窗口过程
例:
//在OnInitDialog中初始化窗体
//新建二维码覆盖窗体
QRCOVERTEXT_Init();
QRCOVERTEXT_Create(m_hWnd, _T("1111111"));
//绘制二维码半透明覆盖窗体
void QRCOVERTEXT_OnPaint(HWND hWnd)
{
HDC hdc;
TCHAR text[256] = _T("testttcolor\ntttttttt");
CRect rect;
GetClientRect(hWnd, &rect);
rect.top = rect.top + 40;
rect.left = rect.left + 40;
PAINTSTRUCT ps;
hdc = ::BeginPaint(hWnd, &ps);
//SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255,0,0));
HFONT _hFont = ::CreateFontIndirect(&appAFXData.lfLittleFont);
//_gpen = CreatePen(PS_SOLID, 2, rgb);
SelectObject(hdc, _hFont);
DrawText(hdc, text, -1, &rect, DT_LEFT | DT_VCENTER);
EndPaint(hWnd, &ps);
}
//初始化窗口属性
void QRCOVERTEXT_OnCreate(HWND hWnd, LPCREATESTRUCT cs)
{
//::SetLayeredWindowAttributes(hWnd, 0, 0, LWA_COLORKEY);
::SetLayeredWindowAttributes(hWnd, 0, 128, LWA_COLORKEY);
}
LRESULT CALLBACK QRCOVERTEXT_WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_CREATE:
QRCOVERTEXT_OnCreate(hWnd, (LPCREATESTRUCT)lParam);
return 1;
case WM_PAINT:
QRCOVERTEXT_OnPaint(hWnd);
return 1;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return ::DefWindowProc(hWnd, Msg, wParam, lParam);
}
//初始化窗口
BOOL UsrLogin::QRCOVERTEXT_Init()
{
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor = NULL;
wc.hIcon = NULL;
wc.hInstance = 0;
wc.lpfnWndProc = QRCOVERTEXT_WindowProc;
wc.lpszClassName = _T("QRCOVERTEXT");
wc.lpszMenuName = NULL;
wc.style = NULL;
return RegisterClass(&wc);
}
//创建窗口
//WS_EX_LAYERED 实现窗口背景透明
//WS_EX_TRANSPARENT 实现鼠标穿透
//WS_EX_TOOLWINDOW 实现不在任务栏显示
//WS_EX_TOPMOST 实现文本置顶
BOOL UsrLogin::QRCOVERTEXT_Create(HWND mainHwnd, LPCTSTR text)
{
DWORD dwStyle;
DWORD dwExStyle;
//dwStyle = WS_POPUP | ES_MULTILINE | WS_VISIBLE | WS_CHILD;
dwStyle = ES_MULTILINE | WS_VISIBLE | WS_POPUP;
dwExStyle = WS_EX_LAYERED | WS_EX_TRANSPARENT;// | WS_EX_TOPMOST | WS_EX_APPWINDOW | WS_EX_TOOLWINDOW;
CRect rect;
m_lbQRPic.GetWindowRect(&rect);
QRCOVERTEXTHwnd = CreateWindowEx(dwExStyle, _T("QRCOVERTEXT"), text, dwStyle, rect.left, rect.top, rect.Width(), rect.Height(), mainHwnd, 0, 0, this);
//QRCOVERTEXTHwnd = CreateWindowEx(WS_EX_LAYERED|WS_EX_TRANSPARENT, _T("static"), _T(""), WS_VISIBLE | WS_CLIPCHILDREN | WS_POPUP, 0, 0, 300, 300, GetParent()->m_hWnd, 0, 0, 0);
if (QRCOVERTEXTHwnd != NULL)
{
::ShowWindow(QRCOVERTEXTHwnd, SW_HIDE);
return TRUE;
}
return FALSE;
}
//login界面大小修改 end: add by zhanghao 2022/06/10//绘制二维码半透明覆盖窗体
void QRCOVERTEXT_OnPaint(HWND hWnd)
{
HDC hdc;
TCHAR text[256] = _T("testttcolor\ntttttttt");
CRect rect;
GetClientRect(hWnd, &rect);
rect.top = rect.top + 40;
rect.left = rect.left + 40;
PAINTSTRUCT ps;
hdc = ::BeginPaint(hWnd, &ps);
//SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255,0,0));
HFONT _hFont = ::CreateFontIndirect(&appAFXData.lfLittleFont);
//_gpen = CreatePen(PS_SOLID, 2, rgb);
SelectObject(hdc, _hFont);
DrawText(hdc, text, -1, &rect, DT_LEFT | DT_VCENTER);
EndPaint(hWnd, &ps);
}
//初始化窗口属性
void QRCOVERTEXT_OnCreate(HWND hWnd, LPCREATESTRUCT cs)
{
//::SetLayeredWindowAttributes(hWnd, 0, 0, LWA_COLORKEY);
::SetLayeredWindowAttributes(hWnd, 0, 128, LWA_COLORKEY);
}
LRESULT CALLBACK QRCOVERTEXT_WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_CREATE:
QRCOVERTEXT_OnCreate(hWnd, (LPCREATESTRUCT)lParam);
return 1;
case WM_PAINT:
QRCOVERTEXT_OnPaint(hWnd);
return 1;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return ::DefWindowProc(hWnd, Msg, wParam, lParam);
}
//初始化窗口
BOOL UsrLogin::QRCOVERTEXT_Init()
{
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor = NULL;
wc.hIcon = NULL;
wc.hInstance = 0;
wc.lpfnWndProc = QRCOVERTEXT_WindowProc;
wc.lpszClassName = _T("QRCOVERTEXT");
wc.lpszMenuName = NULL;
wc.style = NULL;
return RegisterClass(&wc);
}
//创建窗口
//WS_EX_LAYERED 实现窗口背景透明
//WS_EX_TRANSPARENT 实现鼠标穿透
//WS_EX_TOOLWINDOW 实现不在任务栏显示
//WS_EX_TOPMOST 实现文本置顶
BOOL UsrLogin::QRCOVERTEXT_Create(HWND mainHwnd, LPCTSTR text)
{
DWORD dwStyle;
DWORD dwExStyle;
//dwStyle = WS_POPUP | ES_MULTILINE | WS_VISIBLE | WS_CHILD;
dwStyle = ES_MULTILINE | WS_VISIBLE | WS_POPUP;
dwExStyle = WS_EX_LAYERED | WS_EX_TRANSPARENT;// | WS_EX_TOPMOST | WS_EX_APPWINDOW | WS_EX_TOOLWINDOW;
CRect rect;
m_lbQRPic.GetWindowRect(&rect);
QRCOVERTEXTHwnd = CreateWindowEx(dwExStyle, _T("QRCOVERTEXT"), text, dwStyle, rect.left, rect.top, rect.Width(), rect.Height(), mainHwnd, 0, 0, this);
//QRCOVERTEXTHwnd = CreateWindowEx(WS_EX_LAYERED|WS_EX_TRANSPARENT, _T("static"), _T(""), WS_VISIBLE | WS_CLIPCHILDREN | WS_POPUP, 0, 0, 300, 300, GetParent()->m_hWnd, 0, 0, 0);
if (QRCOVERTEXTHwnd != NULL)
{
::ShowWindow(QRCOVERTEXTHwnd, SW_HIDE);
return TRUE;
}
return FALSE;
}