2013-02-26 36 views
0

我想在主窗口中注册一个静态控件,然后用一些文本填充它。将文本添加到在运行时注册的静态控件

下面是完整的代码:

#include <windows.h> 
#include "resource.h" 
#include <commctrl.h> 
void RegisterCommonControls(); 
#pragma comment(lib, "comctl32.lib") 

HINSTANCE hInstance; 
HINSTANCE hPrevInstance; 
int nCmdShow; 

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (Msg) 
    { 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 
     default: 
      return DefWindowProc(hWnd, Msg, wParam, lParam); 
    } 
} 

LRESULT CALLBACK LblStateProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    return DefWindowProc(hWnd, Msg, wParam, lParam); 
} 

void RegisterCommonControls() 
{ 
    INITCOMMONCONTROLSEX iccex; 

    iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    iccex.dwICC = ICC_TREEVIEW_CLASSES | ICC_LISTVIEW_CLASSES; 
    InitCommonControlsEx(&iccex); 
} 

bool RegisterWindow(void) 
{ 
    if (hPrevInstance) 
     return false; 
    WNDCLASS wc; 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = MainWndProc; 
    wc.cbClsExtra = wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(0, IDI_APPLICATION); 
    wc.hCursor = LoadCursor(0, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); 
    wc.lpszMenuName = MAKEINTRESOURCE(IDC_WIN_API); 
    wc.lpszClassName = L"Class1"; 
    if (!RegisterClass(&wc)) 
     return false; 
    return true; 
} 

bool RegisterEdit(void) 
{ 
    if (hPrevInstance) 
     return false; 
    WNDCLASS wc; 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = LblStateProc; 
    wc.cbClsExtra = wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = wc.hCursor = NULL; 
    wc.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH)); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = L"STATIC"; 
    if (!RegisterClass(&wc)) 
     return false; 
    return true; 
} 

int CALLBACK wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) 
{ 
    const int size = 600; 
    MSG msg; 
    RegisterWindow(); 
    HWND hMainWnd = CreateWindow(L"Class1", L"Main Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, size, size, 0, 0, hPrevInstance, NULL); 
    RegisterCommonControls(); 
    RegisterEdit(); 
    HWND hLblState = CreateWindow(L"STATIC", L"1", WS_CHILD | WS_VISIBLE | SS_SIMPLE | SS_OWNERDRAW, 200, 200, 100, 50, hMainWnd, 0, NULL, NULL); 
    ShowWindow(hMainWnd, nCmdShow); 
    UpdateWindow(hMainWnd); 
    SendMessage(hLblState, WM_SETTEXT, NULL, (LPARAM)L"Rectangle"); 
    while(GetMessage(&msg, 0, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return 0; 
} 

所以,我得到一个白色的“静态”窗口在主窗口内(控制是在正确的坐标),无文本中(不是“1”,也不是“矩形“)。我的代码中有什么坏处?

回答

1

您正在注册名为“STATIC”的窗口类。这优先于内置的“STATIC”窗口类,因此您的窗口不像静态控件。

要修复它,请不要注册名为“STATIC”的窗口类。标准的将被用来代替。

+0

那么我该如何注册一个标准控件?在这种情况下如何填写wc? – alexdelphi 2013-02-26 18:38:14

+0

你没有。基本控件将自动为您注册。其他控件需要InitCommonControlsEx。 – arx 2013-02-26 18:53:46

+0

我明白了。以及如何真正设置编辑中的文字?我试着将WM_SETTEXT发送到控件并使用SetWindowText。两者都失败了,因为我认为他们将文本写入到控件的窗口文本中,在我的示例中它不可见。 – alexdelphi 2013-02-26 19:12:07

相关问题