WinAPI ShowWindow не работает, хотя CreateWindowEx, казалось бы, успешно - PullRequest
0 голосов
/ 27 февраля 2011

У меня проблемы с использованием CreateWindowEx . Если я установлю конечный параметр (LPVOID lpParam) в NULL и использую возвращенный дескриптор окна при вызове ShowWindow , окно отобразит все нормально. Однако мне нужно передать указатель на класс, который я буду модифицировать, основываясь на некоторых сообщениях операционной системы, которые я перехватываю. Когда я пытаюсь сделать это, указав lpParam как this , мой возвращенный дескриптор, по-видимому, является мусором, потому что передача его в ShowWindow вызывает: обнаружен во время обратного вызова пользователя. "

Понятия не имею, как это отладить, поэтому я застрял.

Указанный адрес остается неизменным между передачей и извлечением.

Я не определил регистр WM_PAINT.

Обработчик WM_CREATE:

case WM_CREATE:
{

            // get screen resolution
            HWND desktop = GetDesktopWindow();
            RECT R;
            GetWindowRect(desktop, &R);
            int width = R.right - R.left;
            int height = R.bottom - R.top;

            HWND loading_image;
            loading_image = CreateWindowEx(0,L"Static",L"Image", SS_CENTERIMAGE | SS_BITMAP | WS_CHILD | WS_VISIBLE,0,0,width,height,hwnd,(HMENU)ID_IMAGE3,g_hInst,NULL); 
            SetClassLong(loading_image,GCL_STYLE,CS_HREDRAW | CS_VREDRAW);
            HBITMAP bitmap = (HBITMAP)LoadImage(NULL,L"loadingscreen.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
            SendMessage(loading_image,STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)bitmap);

            progressbar = CreateWindowEx(0, PROGRESS_CLASS, (LPTSTR)NULL, WS_CHILD | PBS_SMOOTH | WS_VISIBLE, width/2-400,100,800,20,hwnd,(HMENU)0,g_hInst,NULL);
            SendMessage(progressbar,PBM_SETSTEP,20,NULL);

            CREATESTRUCT* cs = (CREATESTRUCT*)lParam;
            app = (D3DApp*)cs->lpCreateParams;
            return 0;
}

Вызов WindowProc сбой при 70 мсг (WM_WINDOWPOSCHANGING). Это не плохо для предыдущих сообщений: WM_NCCALCSIZE, WM_CREATE, WM_PARENTNOTIFY, WM_SIZE, WM_SIZE или WM_SHOWWINDOW, хотя WM_SHOWWINDOW обрабатывается незадолго до WM_WINDOWPOSCHANGING, так что я предполагаю, что WM_WINWOWS * получает только 10 * WWWWSWOWS *, получая от WM_WINWOWSOW * только 10WWWWSWOWCH

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011

Установить точку останова на CreateWindowEx.Запишите указатель, который вы передаете.

Установите точку останова в вашей функции WindowProc.Убедитесь, что указатель, который он извлекает из данных вашего частного окна (именно там вы храните указатель, верно?), Передается точно так же. Вы используете SetProp и GetProp (см. Тему Свойства окна в MSDN) вместо SetWindowLongPtr, верно?

При входе в WindowProc распечатайте номер сообщения, чтобы вы могли видеть, какое сообщение обрабатывается в случае сбоя (для этого можно использовать точку трассировки).если ваш отладчик поддерживает их, или добавьте к своему коду вызов printf и перекомпилируйте.

1 голос
/ 04 мая 2011

Возможно, у вас уже есть свой ответ, но я думаю, что виновник в:

SetClassLong (loading_image, GCL_STYLE, CS_HREDRAW | CS_VREDRAW);

Зачем вам это нужно?

0 голосов
/ 28 февраля 2011

Вы поняли, что CreateWindowEx отправляет сообщения до его возвращения? Это означает, что ваш WindowProc должен справиться с ними. Вы не показываете этот код, но это распространенная ошибка - слишком рано вызывать CreateWindowEx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...