2014-10-08 122 views
0

我正在编写一个程序,我有一个问题,我希望你们可以帮助我。无法更改背景颜色MDI C++

就像你可以在我的代码下面看到的,我有WinMain WINAPI创建大型机(父窗口)。当我尝试更改wc.hbrBackground变量中的背景颜色时,什么都没有发生。我真的不明白为什么。我尝试了几乎所有的东西。无论我选择哪种颜色,它都保持深灰色背景 - 并且不会出现任何错误。我怀疑客户区的“标记”是问题,但我无法弄清楚。
你们可以帮我改变吗?

我的代码在main.cpp中的摘录:

HWND CreateNewMDIChild(HWND hMDIClient) 
{ 
    MDICREATESTRUCT mcs; 
    HWND hChild; 

    mcs.szTitle = "[Untitled]"; 
    mcs.szClass = g_szChildClassName; 
    mcs.hOwner = GetModuleHandle(NULL); 
    mcs.x = mcs.cx = CW_USEDEFAULT; 
    mcs.y = mcs.cy = CW_USEDEFAULT; 
    mcs.style = MDIS_ALLCHILDSTYLES; 

    hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs); 
    if(!hChild) 
    { 
     MessageBox(hMDIClient, "MDI Child creation failed.", "Oh Oh...", 
     MB_ICONEXCLAMATION | MB_OK); 
    } 
    return hChild; 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_CREATE: 
     {      
      HWND hStatus; 
      int statwidths[] = {100, -1}; 

      CLIENTCREATESTRUCT ccs; 

      // Create MDI Client 

      // Find window menu where children will be listed 
      ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 5); 
      ccs.idFirstChild = ID_MDI_FIRSTCHILD; 

      g_hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE, "mdiclient", NULL, 
       WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE, 
       CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
       hwnd, (HMENU)IDC_MAIN_MDI, GetModuleHandle(NULL), (LPVOID)&ccs); 

      if(g_hMDIClient == NULL) 
        MessageBox(hwnd, "Could not create MDI client.", "Error", MB_OK | MB_ICONERROR); 

      // Create Toolbar 

      HWND hTool; 
      TBBUTTON tbb[5]; 
      TBADDBITMAP tbab; 

      hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, 
        hwnd, (HMENU)IDC_MAIN_TOOL, GetModuleHandle(NULL), NULL); 
      if(hTool == NULL) 
        MessageBox(hwnd, "Could not create tool bar.", "Error", MB_OK | MB_ICONERROR); 

      // Send the TB_BUTTONSTRUCTSIZE message, which is required for 
      // backward compatibility. 
      SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); 

      tbab.hInst = HINST_COMMCTRL; 
      tbab.nID = IDB_STD_SMALL_COLOR; 
      SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab); 

      ZeroMemory(tbb, sizeof(tbb)); 
      tbb[0].iBitmap = STD_FILENEW; 
      tbb[0].fsState = TBSTATE_ENABLED; 
      tbb[0].fsStyle = TBSTYLE_BUTTON; 
      tbb[0].idCommand = ID_FILE_NEW; 


      SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb); 

      // Create Status bar 

      hStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL, 
        WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, 
        hwnd, (HMENU)IDC_MAIN_STATUS, GetModuleHandle(NULL), NULL); 

      SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths); 
      SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Version 1.0.0 beta"); 

    } 
    break; 
    case WM_SIZE: 
    { 
     HWND hTool; 
     RECT rcTool; 
     int iToolHeight; 

     HWND hStatus; 
     RECT rcStatus; 
     int iStatusHeight; 

     HWND hMDI; 
     int iMDIHeight; 
     RECT rcClient; 

     // Size toolbar and get height 

     hTool = GetDlgItem(hwnd, IDC_MAIN_TOOL); 
     SendMessage(hTool, TB_AUTOSIZE, 0, 0); 

     GetWindowRect(hTool, &rcTool); 
     iToolHeight = rcTool.bottom - rcTool.top; 

     // Size status bar and get height 

     hStatus = GetDlgItem(hwnd, IDC_MAIN_STATUS); 
     SendMessage(hStatus, WM_SIZE, 0, 0); 

     GetWindowRect(hStatus, &rcStatus); 
     iStatusHeight = rcStatus.bottom - rcStatus.top; 

     // Calculate remaining height and size edit 

     GetClientRect(hwnd, &rcClient); 

     iMDIHeight = rcClient.bottom - iToolHeight - iStatusHeight; 

     hMDI = GetDlgItem(hwnd, IDC_MAIN_MDI); 
     SetWindowPos(hMDI, NULL, 0, iToolHeight, rcClient.right, iMDIHeight, SWP_NOZORDER); 
    } 
    break; 
    case WM_CLOSE: 
     DestroyWindow(hwnd); 
    break; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
    break; 
    case WM_COMMAND: 
     // Some code 
    default: 
     return DefFrameProc(hwnd, g_hMDIClient, msg, wParam, lParam); 
} 
return 0; 
} 

LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
switch(msg) 
{ 
    case WM_CREATE: 
    { 
       CreateWindow("EDIT", "", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP, 270, 40, 80, 20, hwnd, (HMENU) ID_EB_1, NULL, NULL); 
      CreateWindow("EDIT", "", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 270, 70, 80, 20, hwnd, (HMENU) ID_EB_2, NULL, NULL); 
      CreateWindow("EDIT", "", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 430, 70, 80, 20, hwnd, (HMENU) ID_EB_3, NULL, NULL); 

      CreateWindow("EDIT", "", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 270, 135, 80, 20, hwnd, (HMENU) ID_EB_4, NULL, NULL); 
      CreateWindow("EDIT", "", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 430, 135, 80, 20, hwnd, (HMENU) ID_EB_5, NULL, NULL); 
    } 
    break; 
    case WM_COMMAND: 
       // Some code 
    break; 
    return DefMDIChildProc(hwnd, msg, wParam, lParam); 
    default: 
     return DefMDIChildProc(hwnd, msg, wParam, lParam); 

} 
return 0; 
} 

BOOL SetUpMDIChildWindowClass(HINSTANCE hInstance) 
{ 
WNDCLASSEX wc; 

wc.cbSize  = sizeof(WNDCLASSEX); 
wc.style   = CS_HREDRAW | CS_VREDRAW; 
wc.lpfnWndProc = MDIChildWndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance  = hInstance; 
wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); 
wc.lpszMenuName = NULL; 
wc.lpszClassName = g_szChildClassName; 
wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 

if(!RegisterClassEx(&wc)) 
{ 
    MessageBox(0, "Could Not Register Child Window", "Oh Oh...", 
     MB_ICONEXCLAMATION | MB_OK); 
    return FALSE; 
} 
else 
    return TRUE; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
WNDCLASSEX wc; 
HWND hwnd; 
MSG Msg; 

InitCommonControls(); 

wc.cbSize  = sizeof(WNDCLASSEX); 
wc.style   = 0; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance  = hInstance; 
wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); 
wc.lpszClassName = g_szClassName; 
wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 

if(!RegisterClassEx(&wc)) 
{ 
    MessageBox(NULL, "Window Registration Failed!", "Error!", 
     MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

if(!SetUpMDIChildWindowClass(hInstance)) 
    return 0; 

hwnd = CreateWindowEx(
    0, 
    g_szClassName, 
    "Conosoft Enomi - Version 1.0.0 (beta)", 
    WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 
    CW_USEDEFAULT, CW_USEDEFAULT, 1100, 700, 
    NULL, NULL, hInstance, NULL); 

if(hwnd == NULL) 
{ 
    MessageBox(NULL, "Window Creation Failed!", "Error!", 
     MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

g_hMainWindow = hwnd; 

ShowWindow(hwnd, nCmdShow); 
UpdateWindow(hwnd); 

while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
     if (!TranslateMDISysAccel(g_hMDIClient, &Msg)) 
     { 
      TranslateMessage(&Msg); 
      DispatchMessage(&Msg); 
     } 
} 
return Msg.wParam; 
} 

我真的希望你们能帮助我,谢谢! :)

+0

不应该使用'hbrBackground = GetSysColorBrush(COLOR_3DFACE)'而不是将整数转换为'HBRUSH'? – wimh 2014-10-08 12:31:26

+0

我已经试过,但没有成功。 – Alexander 2014-10-08 14:24:56

回答

2

由于客户机窗口类是由系统预先定义的,因此无法使用hbrBackground来实现此更改。在创建客户端窗口时,您传递了"mdiclient"作为窗口类的名称。您没有注册该课程,它是预先定义的。顺便提一句,您需要使用宏MDICLIENT来指定类名称。

相反,您需要继承客户端窗口并处理WM_ERASEBKGND以根据需要绘制背景。

+0

首先,感谢您的回答。我实际上已经尝试过WM_ERASEBKGND,并将其用作模板:[link] http://msdn.microsoft.com/en-us/library/windows/desktop/dd162482%28v=vs.85%29.aspx但没有更迭。 因此,如果使用WM_ERASEBKGND更改背景颜色,您能帮助我吗?我会很感激。 – Alexander 2014-10-08 14:24:16

+0

这只是窗口子类。在MSDN讨论:http://msdn.microsoft.com/en-gb/library/windows/desktop/bb773183(v=vs.85).aspx – 2014-10-08 14:44:28

+0

我很抱歉队友,但我真的不明白我应该使用它。我已经阅读了链接并阅读了其他一些内容,但我仍然不明白如何使用它。请耐心等待我对C++仍然有点新鲜。 – Alexander 2014-10-08 18:33:02