Windows API:如何将文本绘制到子窗口?

时间:2016-02-05 11:58:03

标签: c++ windows winapi

我最近开始学习Windows API,并希望制作更多交互式GUI应用程序。所有代码都是用C ++编写的。

我所做的是制作一个自定义按钮窗口,而不是使用内置按钮类。我希望每个按钮都有不同的文本,并希望在父窗口中设置它。

所以我创建了按钮并保存了句柄:

hNavBtnNews = CreateWindow(szUW_NAV_BTN, "News", WS_CHILD | WS_VISIBLE, 540, 0, 100, HEADER_HEIGHT, header, NULL, NULL, NULL);

然后为了确保没有失败,我检查手柄并尝试绘制文字:

                if(hNavBtnNews == NULL){
                    printf("\nFailed to Create Window Nav Button \n");
                }else{
                    printf("\nCreated Window Nav Button");
                    HDC hdc;
                    PAINTSTRUCT ps;
                    RECT rect;
                    hdc = BeginPaint(hNavBtnNews, &ps);
                    SetBkMode(hdc, TRANSPARENT);
                    SetTextColor(hdc, BG_TXT_COLOR);
                    GetClientRect(hNavBtnNews, &rect);
                    DrawText(hdc, "News", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
                    EndPaint(hNavBtnNews, &ps);
                }

这一切都是在父窗口过程的WM_CREATE情况下完成的(它本身工作得很好)。文本为浅灰色,按钮背景为深蓝色。除了文本没有被绘制。也没有编译器警告或错误。也许子类化内置控件对此更好,但我不知道如何。任何帮助解决这个问题都将不胜感激。

1 个答案:

答案 0 :(得分:1)

请考虑以下简短的片段作为简单子类化的示例:

LRESULT CALLBACK myDrawButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam,
                                     LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    switch (uMsg)
    {
        case WM_PAINT:
            onBtnPaint(hWnd, wParam, lParam);
            return TRUE;
    }
    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_INITDIALOG:
    {
        HWND button = GetDlgItem(hwndDlg, IDC_BUTTON_TO_SUBCLASS);
        SetWindowSubclass(button, myDrawButtonProc, 0, 0);
    }
    return TRUE;
...
...
...