c ++ winapi不可能创建2个控件 [英] c++ winapi impossible to create 2 controls

查看:282
本文介绍了c ++ winapi不可能创建2个控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建包含richedit控件和列表框控件的窗口,
的问题是,我创建的第二个控件,不显示。
我的意思是:

I'm trying to create window that contain richedit control and listbox control, the problem is that the second control which I create, doesn't show up. I mean:

case WM_CREATE: // In main window procedure
{
    /* Center the main window */
    This->CenterWindow(hwnd);

    /* Initialize the clients list */
    This->InitListClients(hwnd);

    /* Initialize the server log */
    This->InitEditLog(hwnd);

    return 0;
}

如果 InitListClients 函数将首先,只有列表框将显示,
如果 InitEditLog 将是第一,只有richedit会显示。

If InitListClients function will be first, only the listbox will show up, if InitEditLog will be first, only the richedit will show up.

这里是函数:

void ApostleServer::InitEditLog(HWND &_hwnd)
{
    LoadLibrary(TEXT("Riched32.dll"));
    hEditLog = CreateWindowEx(WS_EX_STATICEDGE, "richedit", "bla", WS_CHILD | WS_VISIBLE | ES_MULTILINE, 10, 10, 390, 310, _hwnd, NULL, (HINSTANCE)GetWindowLong(_hwnd, GWL_HINSTANCE), NULL);
}

void ApostleServer::InitListClients(HWND &_hwnd)
{
    hListClients = CreateWindowEx(WS_EX_STATICEDGE, "listbox", "bla", WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 550, 20, 150, 150, _hwnd, NULL, (HINSTANCE)GetWindowLong(_hwnd, GWL_HINSTANCE), NULL);
}



我有一个新手winapi和我找不到解决方案问题。
感谢。

I'm kinda newbie with winapi and I couldn't find solution for this problem. Thanks.

编辑:
正如我所说的,问题的原因是使用类成员。
这是一个我写的整个代码,并有同样的问题:

As I commented, the cause of the problem is the use of class members. Here is a whole code that I've wrote and has the same problem:

#include <Windows.h>
#include <stdlib.h>

class Server
{
public:

    /* Fields */
    MSG* msg;
    WNDCLASSW* wc;
    HWND hListClients;
    HWND hEditLog;

    /* Methods */
    void InitEditLog(HWND &_hwnd)
    {
        LoadLibrary(TEXT("Riched32.dll"));
        hEditLog = CreateWindowExW(WS_EX_STATICEDGE, L"richedit", L"Text", WS_CHILD | WS_VISIBLE | ES_MULTILINE, 10, 10, 390, 306, _hwnd, (HMENU)2, (HINSTANCE)GetWindowLong(_hwnd, GWL_HINSTANCE), NULL);
    }

    void InitListClients(HWND &_hwnd)
    {
        // Here I'm using hListClients class member, and that what cause the problem (I will see only the list on the window)
        hListClients = CreateWindowExW(WS_EX_STATICEDGE, L"listbox", L"asd", WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 410, 10, 160, 306, _hwnd, (HMENU)1, (HINSTANCE)GetWindowLong(_hwnd, GWL_HINSTANCE), NULL);
        // If I was only creating the listbox (without returning handler), I will see the listbox and the richedit.
    }

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

        Server* This = (Server*)GetWindowLongW(hwnd, GWL_USERDATA);

        switch(msg)
        {
            case WM_CREATE:
            {
                /* Initialize the clients list */
                This->InitListClients(hwnd); // Attention that I called this function first.

                /* Initialize the server log */
                This->InitEditLog(hwnd);
                // If I would call this function first, I will see only the richedit.

                return 0;
            }

            case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            }
        }

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

    Server(HINSTANCE &_hInstance)
    {
        msg = new MSG;
        wc = new WNDCLASSW;
        wc->style = CS_HREDRAW | CS_VREDRAW;
        wc->cbClsExtra = 0;
        wc->cbWndExtra = 0;
        wc->lpszClassName = L"ApostleServer";
        wc->hInstance = _hInstance;
        wc->hbrBackground = GetSysColorBrush(COLOR_3DFACE);
        wc->lpszMenuName = NULL;
        wc->lpfnWndProc = WndProc;
        wc->hCursor = LoadCursor(NULL, IDC_ARROW);
        wc->hIcon = LoadIcon(NULL, IDI_APPLICATION);

        RegisterClassW(&(*wc));
        CreateWindowW(wc->lpszClassName, L"Apostle Server", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 600, 400, 0, 0, _hInstance, 0);

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

    }
};

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    Server* srvr = new Server(hInstance);
    return 0;
}


推荐答案

通过创建控件on WM_CREATE 消息(但不设置控制处理程序!),并在创建主窗口后设置控制处理程序。

Problem solved by creating the controls on WM_CREATE message (but not to set control handlers!), and set the control handlers after the creation of the main window.

WM_CREATE 讯息:

    case WM_CREATE:
    {
        /* Center the main window */
        This->CenterWindow(hwnd);

        /* Initialize the clients list */
        This->InitListClients(hwnd);

        /* Initialize the server log */
        This->InitEditLog(hwnd);


        return 0;
    }

创建主窗口后:

RegisterClassW(&(*wc));
hMainWindow = CreateWindowW(wc->lpszClassName, L"Apostle Server", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 600, 400, 0, 0, _hInstance, 0);

/* Set controls handlers */
hListClients = GetDlgItem(hMainWindow, IDC_LISTCLIENTS);
hEditLog = GetDlgItem(hMainWindow, IDC_EDITLOG);

InitEditLog InitListClients 函数:

InitEditLog and InitListClients functions:

void ApostleServer::InitEditLog(HWND &_hwnd)
{
    LoadLibrary(TEXT("Riched32.dll"));
    CreateWindowExW(WS_EX_STATICEDGE, L"richedit", L"Text", WS_CHILD | WS_VISIBLE | ES_MULTILINE, 10, 10, 390, 306, _hwnd, (HMENU)IDC_EDITLOG, (HINSTANCE)GetWindowLong(_hwnd, GWL_HINSTANCE), NULL);
}

void ApostleServer::InitListClients(HWND &_hwnd)
{
    CreateWindowExW(WS_EX_STATICEDGE, L"listbox", L"asd", WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 410, 10, 160, 306, _hwnd, (HMENU)IDC_LISTCLIENTS, (HINSTANCE)GetWindowLong(_hwnd, GWL_HINSTANCE), NULL);
}

这篇关于c ++ winapi不可能创建2个控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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