2011-05-15 97 views
0

我已阅读并阅读,试图找到如何将文本放在自定义控件上。我发现了一些东西,但没有一个是干净和简单的。自定义控件上的文本

那么如何在自定义控件上绘制文本?这里是代码...

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wparam, LPARAM lparam); 
LRESULT CALLBACK CustProc(HWND hwnd, UINT uMsg, WPARAM wparam, LPARAM lparam) ; 
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) 
{ 
wchar_t * windowname = L"window Class"; 
wchar_t * cust = L"custctrl"; 

WNDCLASS wc = {0}; 
wc.lpszClassName = windowname; 
wc.lpfnWndProc = WindowProc; 
RegisterClass(&wc); 

    HWND hwnd = CreateWindowEx(
    0, 
    windowname, 
    L"app", 
    WS_VISIBLE | WS_THICKFRAME| WS_OVERLAPPEDWINDOW , 
    50, 50, 
    500, 500, 
    NULL, 
    NULL, 
    hInstance, 
    NULL 
    ); 



    WNDCLASS button = {0}; 
button.lpfnWndProc = CustProc; 
button.lpszClassName = cust; 
button.hInstance = hInstance; 
button.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); 
button.hCursor = LoadCursor(NULL, IDC_HAND); 
RegisterClass(&button); 



    HWND click = CreateWindowEx(
    WS_EX_CLIENTEDGE, 
    cust, 
    L"Custom Control", //doesnt show up on the window, not to my suprise 
    WS_VISIBLE | WS_CHILD , 
    0, 0, 
    500, 500, 
    hwnd, 
    NULL, 
    hInstance, 
    NULL 
    ); 
    //all the rest... 
} 

LRESULT CALLBACK CustProc(HWND hwnd, UINT uMsg, WPARAM wparam, LPARAM lparam) { 
switch(uMsg) { 
    case WM_CREATE: 
    SetWindowText(hwnd, L"button"); //also doesn't work, also not to my suprise 
case WM_LBUTTONDOWN: { 
MessageBox(hwnd, L"you clicked the custom button", L"cool", 0); // works fine 
break; 
         } 
return 0; 
} 
    return DefWindowProc(hwnd, uMsg, wparam, lparam); 
    } 
+2

和你的问题是..... – 2011-05-15 18:11:45

+0

如果没有额外的功能,你可以捕获WM_PAINT消息,并使用GDI自己绘制文本。 – Fox32 2011-05-15 18:21:15

回答

3

您可以在CustProc功能赶上WM_PAINT消息,绘制自己的文字。

您可以通过调用BeginPaint来获取图形上下文,通过调用EndPaint来绘制文本并关闭图形上下文。您可以使用TextOut函数绘制文本。以下是来自MSDN的示例:

LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    PAINTSTRUCT ps; 
    HDC hdc; 

    switch (message) 
    { 
     case WM_PAINT: 
      hdc = BeginPaint(hwnd, &ps); 
      TextOut(hdc, 0, 0, "Hello, Windows!", 15); 
      EndPaint(hwnd, &ps); 
      return 0L; 

     // Process other messages. 
    } 
} 

完整示例here

+0

那么,这给了我一个白色的背景,你知道如何使它融入背景吗? – 2011-05-15 18:48:40

+0

看看SetBkMode(hdc,TRANSPARENT):http://stackoverflow.com/questions/1340166/transparency-to-text-in-gdi(在谷歌搜索了) – Fox32 2011-05-15 19:27:18

+2

这是一个非常基本的例子。我建议在TextOut上使用DrawText,因为它可以提供更多的控制。此外,您应该创建第二个设备上下文,并对其进行所有绘制,然后将其添加到主设备上下文中。这对于防止自定义控件中的闪烁会做很多工作。 – Gogeta70 2011-05-15 22:43:43