基于Win32的应用程序,尝试更新标签的文本

时间:2012-06-04 21:40:49

标签: c++ winapi win32gui

此代码显示一个带有文本标签的窗口,上面写着:“请输入一个数字”和一个按钮。

单击按钮时,应将文本替换为“TEXT”。它可以工作,但它会在第一个文本的顶部写入/打印新文本。所以重叠。

我希望更改文本字符串而不是写入第一个文本,但我不知道我是如何对Windows应用程序开发的新手。

请帮帮我们。

整个来源是:

#include <windows.h>
#include <iostream>


using namespace std;


enum { ID_LABEL = 1,ID_BUTTON0};

static  HWND static_label, button0;

HDC          hdc;
HBRUSH  NewBrush;
HINSTANCE g_hInst;


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    LPCTSTR className = TEXT("myClass");
    WNDCLASSEX wc;

    wc.cbSize        = sizeof(wc);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.cbWndExtra    = 0;
    wc.cbClsExtra    = 0;
    wc.lpfnWndProc   = WndProc;
    wc.hInstance     = hInstance;
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = TEXT("myClass");


    wc.hbrBackground  = (HBRUSH)(CreateSolidBrush(RGB(48, 38, 88)));

    wc.hIcon             = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm           = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor           = LoadCursor(NULL, IDC_ARROW);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, TEXT("ERROR! FAILED TO REGISTER CLASS!"), TEXT("FATAL ERROR!"), MB_IConerror | MB_OK);
        return 1;
    }

    HWND hwnd = CreateWindowEx(0, TEXT("myClass"), TEXT("WINDOW TITLE"), WS_OVERLAPPEDWINDOW, 450, 100, 500 + 7, 500 + 33 , NULL, NULL, hInstance, NULL);

    if(!hwnd)
    {
        MessageBox(NULL, TEXT("ERROR! FAILED TO CREATE WINDOW!"), TEXT("FATAL ERROR!"), MB_IConerror | MB_OK);

        return true;
    }  

    ShowWindow(hwnd, nShowCmd);                
    UpdateWindow(hwnd); 

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}



LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_PAINT:
        {

        }

        case WM_CTLCOLORSTATIC:
        {
           SetBkMode((HDC) wParam, TRANSPARENT);        

           return (LONG) GetStockObject(NULL_BRUSH);
    }

    break;

    case WM_CREATE:
    {
        static_label = CreateWindow(L"Static",L"Please Enter A Number",WS_CHILD | WS_VISIBLE,35,15,175,25,hwnd,0, g_hInst,0);

        button0 = CreateWindow(L"Button",L"OK",BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE ,80,220,35,35,hwnd,(HMENU)ID_BUTTON0,g_hInst,0);   
      }

      break;

      case WM_COMMAND: //Command from Child windows and menus are under this message

      switch(wParam) //the ID is wParam
      {
         case ID_BUTTON0: //check for our button ID
         {
             SetWindowText(static_label,L"TEXT");

             break;
         }
      }//switch. 

  break;

  case WM_DESTROY: 
         PostQuitMessage(0);
         break; // pass to DefWindowProc(...) as well

      case WM_CLOSE:
         DestroyWindow(hwnd);
         break;
   } 

    return DefWindowProc(hwnd, msg, wParam, lParam);    
}

4 个答案:

答案 0 :(得分:6)

问题在于:

case WM_CTLCOLORSTATIC:
{
   SetBkMode((HDC) wParam, TRANSPARENT);        
   return (LONG) GetStockObject(NULL_BRUSH);
}

此代码告诉静态控件绘制没有背景颜色的文本而不重绘背景。因此,新文本将在旧文本之上而不是在新背景上绘制。

如果您需要显示某些自定义背景,那么您必须使底层父窗口的该部分无效并可能使用WS_EX_TRANSPARENT之类的内容来确保最后绘制子静态控件。这样,当它试图绘制新文本时,应该绘制一个新的背景。

请注意,这意味着您无法在底层父窗口上使用WS_CLIPCHILDREN,这会在重绘内容时增加闪烁。

答案 1 :(得分:3)

您的文本正在“静态”窗口中显示,并且他们不希望文本发生更改,因此他们无法正常处理它。您需要强制控件擦除并重绘自己。

RedrawWindow(static_label, NULL, NULL, RDW_ERASE);

答案 2 :(得分:3)

RedrawWindow(H_frame,NULL,NULL,RDW_INVALIDATE)在我想要激发WM_CTLCOLORSTATIC引起的更改以立即显示效果时为我工作。

我之前得到了SendMessage(H_frame,WM_CTLCOLORSTATIC,0,(int)SpecificControlHandle)的部分结果,但这只能部分工作,因为被调用的函数正在执行GetWindowDC并绘制东西....

RedrawWindow(H_frame,NULL,NULL,RDW_INVALIDATE)方法要好得多。我一直在改变文本的文本和背景颜色(以及使用SetWindowLong(SpecificControlHandle,GWL_ID,SomeNewID)控制的ID,告诉程序在发送WM_CTLCOLORSTATIC之后要采取哪条路径。让它被发送是由RedrawWindow解决的位(H_frame,NULL,NULL,RDW_INVALIDATE),因此我的帖子。如果在更改STATIC的ID后它可以工作,它应该在更改任何其他属性或样式等后工作。

答案 3 :(得分:2)

使用此代码在 SetWindowText 功能后更新标签:

SetWindowText(static_label,L"TEXT");         

ShowWindow(static_label, SW_HIDE);
ShowWindow(static_label, SW_SHOW);