首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateWindow“编辑”类型字符是‘隐形’?

CreateWindow“编辑”类型字符是‘隐形’?
EN

Stack Overflow用户
提问于 2021-05-03 12:55:36
回答 1查看 82关注 0票数 0

在研究了CreateWindow("Edit")调用的所有正确语法之后,我不得不认输:当我运行程序时,我在编辑框中得到的只是“不可见的字符”。当我键入时,光标正在向右移动,但我输入的字符在哪里都看不到。只有当我用鼠标选择方框内容时,我才会看到文本。但我一松开鼠标,就什么也看不见了。

下面是导致Edit控件中“文本未显示”的整个代码:

代码语言:javascript
复制
#include <windows.h>

#define FILE_MENU_NEW 1
#define FILE_MENU_OPEN 2
#define FILE_MENU_QUIT 3
#define CHANGE_TITLE 4

LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
void AddMenus(HWND);
void AddControls(HWND);     
HMENU hMenu;
HWND hEdit;

int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd)
{
    WNDCLASS wc = {0}; // Assign 0 to all its elements initialy
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hInstance = hInstance;
    wc.lpszClassName = L"myWindowClass";
    wc.lpfnWndProc = WindowProc; // this is a pointer to a function

    if(!RegisterClass(&wc))
        return -1;

    HWND hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,                               
        L"myWindowClass",                           
        L"Learn to Program Windows - Roger Breton",     
        WS_OVERLAPPEDWINDOW | WS_VISIBLE ,              
        100, 100, 800, 600,
        NULL,       
        NULL,       
        hInstance, 
        NULL        
    );

    if (hwnd == NULL)
    {
        return 0;
    }

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

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_COMMAND:
        switch(wParam)
        {
        case FILE_MENU_QUIT:
            DestroyWindow(hWnd);    
            break;

        case FILE_MENU_NEW:
            MessageBeep(MB_ICONINFORMATION);
            break;

        case CHANGE_TITLE:
            wchar_t text[100];
            GetWindowTextW(hEdit, text, 100);   
            SetWindowTextW(hWnd, text);
            break;
        }

    case WM_CREATE:             
        AddMenus(hWnd);
        AddControls(hWnd);
        break;

    case WM_DESTROY:                
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW));
        EndPaint(hWnd, &ps);
    }

    return 0;
    }

    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

void AddMenus(HWND hWnd)    
{
    hMenu = CreateMenu(); 
    HMENU hFileMenu = CreateMenu();
    HMENU hSubMenu = CreateMenu(); 
    AppendMenu(hSubMenu, MF_STRING, NULL, L"Sub-Menu");
    AppendMenu(hFileMenu, MF_STRING, FILE_MENU_NEW, L"New");
    AppendMenu(hFileMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"Sub-menu ");
    AppendMenu(hFileMenu, MF_SEPARATOR, NULL, NULL);
    AppendMenu(hFileMenu, MF_STRING, FILE_MENU_QUIT, L"Quit");
    AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hFileMenu, L"File");
    AppendMenu(hMenu, MF_STRING, NULL, L"Aide");
    SetMenu(hWnd, hMenu);    
}

void AddControls(HWND hWnd) 
{
    CreateWindowW(L"Static", L"Enter text here:", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER , 200, 100, 150, 50, hWnd, NULL, NULL, NULL);
        hEdit = CreateWindowW(L"Edit", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER , 200, 152, 100, 50, hWnd, NULL, NULL, NULL);
    CreateWindowW(L"Button", L"Changez title", WS_VISIBLE | WS_CHILD, 200, 204, 150, 50, hWnd, (HMENU)CHANGE_TITLE, NULL, NULL); 
}

我多次尝试重新创建源文件,但没有效果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-03 13:07:01

break;块的末尾有一个缺少的case WM_COMMAND:语句。目前,您的代码将在处理任何case WM_CREATE:代码后“通过”到WM_COMMAND代码。

添加break;语句似乎修复了您的代码(当我测试它时):

代码语言:javascript
复制
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)     {
        case WM_COMMAND:
            switch (wParam)         {
                case FILE_MENU_QUIT:
                    DestroyWindow(hWnd);
                    break;
                case FILE_MENU_NEW:
                    MessageBeep(MB_ICONINFORMATION);
                    break;
                case CHANGE_TITLE:
                    wchar_t text[100];
                    GetWindowTextW(hEdit, text, 100);
                    SetWindowTextW(hWnd, text);
                    break;
            }
            break; // ** You missed this line! **
        case WM_CREATE:
            AddMenus(hWnd);
            AddControls(hWnd);
            break;
//...

如果启用所有编译器警告,就会发现这些错误: MSVC中的静态代码分析器给出了以下消息:

警告C26819:开关标签(es.78)之间未加注释的下降(

)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67369288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档