背景:我想做一個子視窗對話框,但由于目標是做一個界面庫,所以不能用往.rc里丟dialog的方法.創建對話框時需要初始化控制元件,如果我在創建視窗時用#32770對話框,不會處理WM_CREATE訊息,則不能回應創建。
于是,我想自己創建的視窗類應該是可以回應WM_CREATE的(我也不知道但我想嘗試一下,如果大家有更好的辦法也可以)
namespace NormalTip {
HINSTANCE b_hInstance;
HWND c_tip1;
HWND c_tip2;
WNDPROC TipBoxProc;
WNDPROC BTold;
typedef struct TagTipBox
{//
HWND hWnd;
BOOL x1;
BOOL x2;
LPWSTR in;
UINT style;
} TIP_PARAM;
int NormalTipHeight = 40;
int nh = NormalTipHeight;
void DrawFrameBtn(HDC hdc, HPEN hpen, RECT rect, BOOL wid, COLORREF cl)
{
hpen = CreatePen(PS_SOLID, wid, cl);
SelectObject(hdc, hpen);
SelectObject(hdc, (HBRUSH)GetStockObject(NULL_BRUSH));
//Rectangle(hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top);
Rectangle(hdc, 2, 2, rect.right - rect.left - 1, rect.bottom - rect.top - 1);
}
}
//
//
LRESULT CALLBACK CTipProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{//
using namespace::NormalTip;
PAINTSTRUCT ps;
HDC hdc = NULL;
RECT rc;
GetClientRect(hWnd, &rc);
LOGFONT lf;
HFONT hFont = 0;
HBRUSH br;
TCHAR txt[40];
TIP_PARAM* pmmb = (TIP_PARAM*)lParam;
UNREFERENCED_PARAMETER(lParam);
switch (Msg)
{//
case WM_/*我弄類的目的就是讓它在創建時顯示控制元件,和WM_CREATE差不多的效果*/:
{
//Button(hWnd, 1, 1, L"關閉", 999);
OutputDebugStringA("Button__ Created");//
break;
}
case WM_PAINT:
{
HBRUSH hbr = NULL;
HPEN hpen = 0;
hdc = BeginPaint(hWnd, &ps);
hbr = CreateSolidBrush(UICOLOR_BUTTON);
FillRect(hdc, &rc, hbr);
GetWindowText(hWnd, txt, 40);
SetTextColor(hdc, UICOLOR_BUTTON_TEXT);
SetBkMode(hdc, TRANSPARENT);
if (hFont == 0)
{
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = -16;
wcscpy(lf.lfFaceName, L"黑體");
hFont = CreateFontIndirect(&lf); // create the font
}
HFONT old = (HFONT)SelectObject(hdc, hFont);
//TextOut(hdc, 16, 7, txt, wcslen(txt) /*&ps.rcPaint*//*DT_SINGLELINE | DT_CENTER | DT_VCENTER*/);
DrawText(hdc, txt, wcslen(txt), &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
DrawFrameBtn(hdc, hpen, rc, 2, UICOLOR_BUTTON);
ReleaseDC(hWnd, hdc);
UpdateWindow(hWnd);
DeleteObject(hbr);
DeleteObject(hpen);
EndPaint(hWnd, &ps);
OutputDebugStringA("Tip Created");
break;
}
case WM_LBUTTONDOWN:
{
// 移動視窗
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); //向視窗發送WM_NCLBUTTONDOWN訊息,HTCAPTION 標題
break;
}
}
//
return CallWindowProc(TipBoxProc, hWnd, Msg, wParam, lParam);
}
WCHAR szWindowClasst[] = L"TipBoxClass";
ATOM _TipBoxRegisterClass(HINSTANCE hInstance)
{
using namespace::NormalTip;
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = CTipProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = b_hInstance;
wcex.hIcon = LoadIcon(hInstance, 0);
wcex.hCursor = LoadCursor(nullptr, 0);
wcex.hbrBackground = CreateSolidBrush(RGB(239, 244, 255));
wcex.lpszMenuName = MAKEINTRESOURCEW(0);
wcex.lpszClassName = szWindowClasst;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
//HWND 主視窗,__x1 x坐標,__x2 y坐標,L"文字",對應的訊息處理
//如果需要進行訊息處理,case IDC_XX:
int VertexUITipBox(
HWND hWnd, // handle of owner window
BOOL x1,
BOOL x2,
LPCTSTR in,
UINT style //
)
{
using namespace::NormalTip;
int len = wcslen(in);
if (len > 3)
{
if (wcslen(in) % 2 == 0)
{
len = len * 2 * 9 + 18;
}
else
{
len = len * 8 + 20;
}
}
else
{
len = 60;
}
if (!_TipBoxRegisterClass(b_hInstance))
{
MessageBox(0, 0, 0, 0);//錯誤檢測,但這個似乎沒錯
}
static HFONT hFont;
TIP_PARAM tip;
tip.hWnd = hWnd;
tip.style = style;
c_tip1 = CreateWindow(L"TipBoxClass", in, WS_VISIBLE | WS_CHILD ,//默認按鈕樣式
x1, x2, len, 90, hWnd, (HMENU)style, b_hInstance, NULL);
TipBoxProc = (WNDPROC)SetWindowLongPtr(c_tip1, GWLP_WNDPROC, (LONG_PTR)CTipProc);
return -1;
}TipBox(hWnd, 114, 514, L"文本", 0x80);
為了除錯方便可以把CreateWindow里的TipBoxClass暫時改回#32770
別用資源檔案添加Dialog的方法謝謝
這是全部代碼,目標就是解決類創建問題并且實作在子視窗創建時進行相應的回應.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/244434.html
標籤:界面
上一篇:多執行緒的SetEvent問題
