Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDI client fail, не удается создать окно 
V
    Опции темы
ForceKeeper
Дата 18.12.2011, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.3.2010
Где: Минск

Репутация: нет
Всего: нет



Пытаюсь первый раз написать mdi-приложение и вызов CreateMDIWindow() возвращает ноль и при этом GetLastError() тоже ноль возращает. В мсдн написано, что если вернулся нулевой hwnd, то произошла ошибка, а при этом GetLastError() рапортует, что таковых нет. Что за радость такая?
PM MAIL WWW   Вверх
vol4ek
Дата 18.12.2011, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



Дайте людям код посмотреть. Телепатов нет. smile 
PM MAIL ICQ   Вверх
ForceKeeper
Дата 18.12.2011, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.3.2010
Где: Минск

Репутация: нет
Всего: нет



Я думал, что ситуация когда ошибка есть, а гетЛастЕррор ее не видит, весьма специфична. Ок. Вот кусок кода
Код

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ChildProc(HWND hChild, UINT message, WPARAM wParam, LPARAM lParam);
BOOL InitApplication(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
VOID GetWindowsError();

HMENU hMenu;
HWND hWndFrame;
HWND hWndClient;
HINSTANCE hInst;

LPCSTR szFrameClassName = "MDI Frame";
LPCSTR szClientClassName = "MDICLIENT";
LPCSTR szChildClassName = "MDI Child";
LPCSTR szFrameTitle = "Имя фрейма";
LPCSTR szChildTitle = "Имя документа";
MDICREATESTRUCT mdiStruct;
WorkspaceManager wsManager;
BOOL isGridEnabled;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hInst = hInstance;
    MSG msg;
    if (!InitApplication(hInstance))
        return (FALSE);

    if (!InitInstance(hInstance, nCmdShow))
        return(FALSE);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if(!TranslateMDISysAccel(hWndClient, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (msg.wParam);
}

BOOL InitApplication(HINSTANCE hInstance)
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_ASTERISK);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
    wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENUSTRIP);
    wc.lpszClassName = szFrameClassName;
    wc.hIconSm  = LoadIcon(wc.hInstance, NULL);
    BOOL resFrame = RegisterClassEx(&wc);
    if(!resFrame) 
    {
        GetWindowsError();
    }

    wc.lpfnWndProc = (WNDPROC)ChildProc;
    wc.lpszClassName = szChildClassName;
    //wc.cbWndExtra = DLGWINDOWEXTRA;
    wc.lpszMenuName = NULL;
    BOOL resChild = RegisterClassEx(&wc);
    if(!resChild) 
    {
        GetWindowsError();
    }

    return resFrame && resChild;
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    hWndFrame = CreateWindowEx (
        NULL,
        szFrameClassName,
        szFrameTitle,
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);

    if (!hWndFrame) 
        return (FALSE);
    
    ShowWindow(hWndFrame, nCmdShow);
    UpdateWindow(hWndFrame);
    
    return (TRUE);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;

    switch (message)
    {
    case WM_CREATE:
        {
            CLIENTCREATESTRUCT clientStruct;
            clientStruct.hWindowMenu = GetSubMenu(GetMenu(hWnd), 0);
            clientStruct.idFirstChild = 50000;

            hWndClient = CreateWindowEx (
                WS_EX_CLIENTEDGE,
                szClientClassName,
                NULL,
                WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                hWnd,
                NULL,
                GetModuleHandle(NULL),
                &clientStruct);
            if(!hWndClient)
            {
                GetWindowsError();
            }

            ShowWindow(hWndClient, SW_SHOW);

            mdiStruct.szClass = szChildClassName;
            mdiStruct.szTitle = szChildTitle;
            mdiStruct.hOwner = hInst;
            mdiStruct.x = CW_USEDEFAULT;
            mdiStruct.y = CW_USEDEFAULT;
            mdiStruct.cx = CW_USEDEFAULT;
            mdiStruct.cy = CW_USEDEFAULT;
            mdiStruct.style = NULL;
            mdiStruct.lParam = NULL;

            HWND hwndSystemInformation = (HWND) SendMessage(hWndClient,
                                    WM_MDICREATE, 
                                    0,
                                (LPARAM) (LPMDICREATESTRUCT) &mdiStruct) ;

В hwndSystemInformation пишется ноль
PM MAIL WWW   Вверх
vol4ek
Дата 18.12.2011, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



PM MAIL ICQ   Вверх
ForceKeeper
Дата 19.12.2011, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.3.2010
Где: Минск

Репутация: нет
Всего: нет



Спасибо, оказалось я в процедуре дочерних окон при обработке сообщений забыл перед 

Код

DefMDIChildProc(hWnd, message, wParam, lParam);


поставить return
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0960 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.