【问题标题】:WinApi control doesn't show on the main windowWinApi 控件不显示在主窗口上
【发布时间】:2011-05-18 07:47:49
【问题描述】:

您好,我有以下 win32 程序,并且我有一个未显示在屏幕上的 EDITTEXT 控件。本来应该在主窗口上绘制两个EDITTEXT控件,但是只显示一个,这是为什么呢?

完整代码

#include <windows.h>
#include <iostream>
#include "resource.h"
using namespace std;
const int BUFFERMAX = 512;
char server_ip[BUFFERMAX];
int port;


const char windclassname[] = "windowClass";

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


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

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

    //Registering the Class for use.
    if ( !RegisterClassEx(&parent_window)){
        MessageBox(NULL,"Could not Register WindowClass","Error",MB_OK);
        return 0;
    }

    //Creating the window
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,windclassname,"UI test",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,250,350,NULL,NULL,hInstance,NULL);
    if ( hwnd == NULL ){
        MessageBox(NULL,"Could not create window","Error",MB_OK);
        return 0;
    }

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

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

}

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

            HWND chatbox_cntrl;
            HWND message_text;

            chatbox_cntrl = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",
                WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
                0,0,240,260,hwnd,(HMENU)CHATBOX,GetModuleHandle(NULL),NULL);

            message_text = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",
                WS_CHILD,0,270,240,10,hwnd,(HMENU)MESSAGETEXT,GetModuleHandle(NULL),NULL);

        break;
        case WM_COMMAND:
            switch(LOWORD(wParam)){
                case ID_MABOUT_INFO:
                    DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_MABOUT_INFO), hwnd,AboutDialog);
                break;

                case ID_MCONTROLS_CONNECT:
                    int ret = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_MCONTROLS_CONNECT), hwnd,ConnectWin);
                break;
                case ID_MCONTROLS_EXIT:
                    DestroyWindow(hwnd);
                break;
            }
        break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hwnd,msg,wParam,lParam);

}

INT_PTR CALLBACK AboutDialog(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
    switch (msg){
        case WM_CLOSE:
            EndDialog(hwnd,WM_CLOSE);
        break;
        default:
            return false;
    }
    return true;

}

INT_PTR CALLBACK ConnectWin(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
    switch(msg){
        case WM_COMMAND:
            switch(wParam){
                case CONNECT_BUTTON:
                    int len = GetWindowTextLength(GetDlgItem(hwnd,EDITTEXT_CONNECT));
                    int recv = GetDlgItemText(hwnd,EDITTEXT_CONNECT,server_ip,len+1);
                    port = GetDlgItemInt(hwnd,EDITTEXT_PORT,NULL,false);
                    EndDialog(hwnd,CONNECT_BUTTON);
                break;
            }
        break;
        case WM_CLOSE:
            EndDialog(hwnd,WM_CLOSE);
        break;
        default:
            return false;
    }
    return true;
}

这是两个控件。

case WM_CREATE:

            HWND chatbox_cntrl;
            HWND message_text;

            chatbox_cntrl = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",
                WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
                0,0,240,260,hwnd,(HMENU)CHATBOX,GetModuleHandle(NULL),NULL);

            message_text = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",
                WS_CHILD,0,270,240,10,hwnd,(HMENU)MESSAGETEXT,GetModuleHandle(NULL),NULL);

        break;

【问题讨论】:

    标签: c++ controls winapi


    【解决方案1】:

    消息文本窗口没有与第一个相同的样式标志。具体来说,它缺少WS_VISIBLE。这很可能是你的问题。

    【讨论】:

    • @sil3nt:无需道歉。这是您的 OP 中的拼写错误,还是解决了问题?
    • 不幸的是,这是一个错误,我在写它的时候没有注意。最近才开始学习 API :)。
    【解决方案2】:

    您在创建编辑窗口之前是否致电InitCommonControlsEx()CreateWindow() 是否返回有效的HWND

    INITCOMMONCONTROLSEX icc;
    icc.dwSize = sizeof(icc);
    // Load one of the intrinsic User32 control classes.
    // The user controls include button, edit, static,
    // listbox, combobox, and scrollbar. 
    dwICC = ICC_STANDARD_CLASSES;
    ::InitCommonControlsEx(&icc);
    

    【讨论】:

    • -1。 InitCommonControlsEx() 与编辑控件无关。编辑控件是在 user32 而不是 comctl32 中实现的。
    • @Xearinox:The edit control is implemented in both user32 and comctl32。即使不是这种情况,用the ICC_STANDARD_CLASSES flag set 调用InitCommonControlsEx() 声明它将“加载一个固有的User32 控件类。用户控件包括按钮、编辑、静态、列表框、组合框和滚动条" 使用这个函数来加载编辑控件是合适的,特别是如果你想要视觉样式。
    • @Xearinox:你看过我链接的 MSDN 文档了吗? Comctl32 包含在 Windows XP 中,文档专门针对 Windows XP 做了说明,编辑控件存在于 user32 和 comctl32 中,并且行为略有不同(即密码字符的外观)。
    • 哦,我知道这个功能。我的错。
    【解决方案3】:

    您是否在使用 InitCommonControlsEx 加载控件之前对其进行了初始化?试试这个代码一。

    int InitControls() {
        INITCOMMONCONTROLSEX iccx;
    
        iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
        iccx.dwICC = ICC_WIN95_CLASSES;
    
        InitCommonControlsEx(&iccx);
    }
    

    记得包含头文件 commctrl.h 和库 comctl32.dll

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2021-05-29
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多