CreateWindow“编辑”键入的字符是不可见的吗? [英] CreateWindow “Edit” typed characters are 'invisible'?

查看:23
本文介绍了CreateWindow“编辑”键入的字符是不可见的吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

以下是导致编辑控件中的"Text Not Display"的完整代码:

#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); 
}

我多次尝试重新创建源文件,但都无济于事。

推荐答案

case WM_COMMAND:块的末尾缺少break;语句。照现在的情况,您的代码将在处理任何WM_COMMAND后‘跌落’到case WM_CREATE:代码。

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

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:交换机标签(E.78)之间的无注释故障。

这篇关于CreateWindow“编辑”键入的字符是不可见的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆