1

Тема: WinApi

Пробую написати форму в С++ використовуючи WinApi. Алгоритм не працює не можу виправити ошибки. Допоможіть, якщо є можливість. Алгоритм програми:

#include <windows.h>

#define width 640
#define height 480

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam);

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    HWND hwnd;
    MSG uMsg;
    WNDCLASS windowClass;
    memset(&windowClass,0,sizeof(WNDCLASSEXW));
    windowClass.cbsize=sizeof(WNDCLASSEXW);
    windowClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);//Задаєм фоновий колір форми
    windowClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    windowClass.hIcon=LoadIcon(Null,IDC_HAND);
    windowClass.hInstance=hInstance;
    windowClass.lpfnWndProc=WindowProc;
    windowClass.lpszClassName="Simple Windows";
    
    RegisterClassEx(&windowClass);
    
    hwnd=CreateWindow(windowClass.lpszClassName, "My first Name", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
    (GetSystemMetrics(SM_CXSCREEN)-width)/2, (GetSystemMetrics(SM_CYSCREEN)-height)/2, width, height, NULL, NULL, NULL, NULL);
    ShowWindow(hwnd, nCmdShow);
    
    while(GetMessage(&uMsg, hwnd, NULL, NULL))
        {
        TranslateMessage(&uMsg);
        DispatchMessage(&uMsg);
        }
        return uMsg, wParam;
    }
    
 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
 {
 Switch(uMsg)
    {
        case WM_CLOSE:
        ExitProcess(0);
        break;
    default:
    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    }
   
 }

Працюю В Visual Studio 8. Виводить наступні ошибки:
1.error C2039: 'cbsize' : is not a member of 'tagWNDCLASSA'
2.error C2065: 'Null' : undeclared identifier   
3.error C2664: 'RegisterClassExA' : cannot convert parameter 1 from 'WNDCLASS *' to 'const WNDCLASSEXA
4.error C2065: 'wParam' : undeclared identifier   
5.error C3861: 'Switch': identifier not found   
6.error C2046: illegal case   
7.error C2043: illegal break   
8.error C2047: illegal default

2 Востаннє редагувалося cuhedg (09.06.2013 14:49:11)

Re: WinApi

Спробуйте cbSize, NULL, switch  (з таким регістром).
А також

return uMsg.wParam;

Для чого ви використовуєте різні структури?

    WNDCLASS windowClass;
    memset(&windowClass,0,sizeof(WNDCLASSEXW));

Оберіть якусь одну.

3

Re: WinApi

МСДН написав:
typedef struct tagWNDCLASS {
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
} WNDCLASS, *PWNDCLASS;

Як бачите, ні слова про cbsize. Треба структуру WndClassEx.

Усе інше - згідно зауважень cuhedg'а. :)

4

Re: WinApi

Ситуація змінилась накраще, але залишаються дві ошибки
Error    1    C2039: 'cbSize' : is not a member of 'tagWNDCLASSA'
Error    2    error C2664: 'RegisterClassExA' : cannot convert parameter 1 from 'WNDCLASS *' to 'const WNDCLASSEXA

5

Re: WinApi

cuhedg написав:

Спробуйте cbSize, NULL, switch  (з таким регістром).
А також

return uMsg.wParam;

Для чого ви використовуєте різні структури?

    WNDCLASS windowClass;
    memset(&windowClass,0,sizeof(WNDCLASSEXW));

Оберіть якусь одну.

memset - як я розумію ця функція передає адрес розмір блоку памяті і значення яке маєм заповнити...

6

Re: WinApi

Я мав на увазі, що ви оголосили структуру WNDCLASS, а потім плутаєте її з WNDCLASSEX.
Шановний Bartash вже сказав що вам робити.

Подякували: LeoDevel1

7

Re: WinApi

LeoDevel написав:

Ситуація змінилась накраще, але залишаються дві ошибки
Error    1    C2039: 'cbSize' : is not a member of 'tagWNDCLASSA'
Error    2    error C2664: 'RegisterClassExA' : cannot convert parameter 1 from 'WNDCLASS *' to 'const WNDCLASSEXA

WndClass та WndClassEx - дві різні структури. Виберіть одну з них (ліпше WndClassEx).

8

Re: WinApi

Велике дякую...все працює...