Простой пример создания окна с помощью win api на си - win forms

Разберём здесь базовый пример. позже выложу более подробные комментарии кода.

vedro-compota's picture

А теперь расмотрим конкретый пример использования winapi для получения простейшего пользовательского интерфейса -
окна с кнопкой, по нажатии на которую "вываливается " сообщение. (код на языке си) =

 #include  windows.h>
	LRESULT CALLBACK MainWinProc(HWND,UINT,WPARAM,LPARAM);
		#define ID_MYBUTTON 1    /* идентификатор для кнопочки внутри главного окна 
		                       = определяем этот идентификатор как единицу  */

		int WINAPI WinMain(HINSTANCE hInst,  HINSTANCE qwe,LPSTR qwer, int ss) 
		{     /* */
			 /* создаем и регистрируем класс главного окна */
			  /* это си код , с использованием структур - читай учебник по си, если 
               не знаешь что это такое*/
			 WNDCLASS wc; /*объявляем наш класс*/ 
			 wc.style=0; /* стиль (поведение) класса окон,*/
			 wc.lpfnWndProc=MainWinProc; /*процедура обработки событий окна - передаём указатель на функцуию*/
			 wc.cbClsExtra=0; /*размер дополнительной памяти в системной структуре класса для данных пользователя */
			 wc.cbWndExtra=0; /*  размер дополнительной памяти в системной структуре окна для данных пользователя*/
			 wc.hInstance=hInst;/*дескриптор модуля (экземпляра программы), в котором реализована процедура обработки - передаём указатель на нашу программу ,полученный из WinMain() */
			 wc.hIcon=NULL; /* дескриптор иконки окна*/
			 wc.hCursor=NULL; /*дескриптор курсора мыши для окна */
			 wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);/* дескриптор "кисточки" для закрашивания фона окна - определяем стиль закрашивания*/
			 wc.lpszMenuName=NULL;/* имя ресурса, содержащего меню окна*/
			 wc.lpszClassName="Example_code_win_api_on_c_realization_simple";/* имя класса*/
			 if (!RegisterClass(&wc)) return FALSE; /*  регистрируем класс программы с заполненной структорой  -в случае деуспешности последнего действа -
			                                       возвращаем "наружу" всеми признанный идентификатор неуспешности - false*/

												   
			 /* создаем главное окно и отображаем его  - передаём 11 параметров*/
			 HWND hMainWnd=CreateWindow("Example_code_win_api_on_c_realization_simple", /*имя класса  */
			 "EXAMPLE WIN API C",/*имя окна (заголовок) */
			 WS_OVERLAPPEDWINDOW, /*стиль (поведение) окна =  стиль WS_OVERLAPPEDWINDOW дарует окну стандартные в числе прочего 
                                 стандартные кнопки свёртывания - развёртывания и заголовок	*/
			 /*CW_USEDEFAULT - этот параметр предлагает операционной системе виндоус самой определиться со значением ниже 
              перечисленных характеристик окна.*/
			  CW_USEDEFAULT, /*горизонтальная позиция окна на экране -  точка левого верхнего угла окна - х-координата  */
			  CW_USEDEFAULT, /*вертикальная позиция окна на экране -  точка левого верхнего угла окна - у-координата  - от нее откладываются длина и высота*/
			  CW_USEDEFAULT, /*ширина окна */
			  CW_USEDEFAULT, /*высота окна */
			  NULL, /*дескриптор родительского окна */
			  NULL, /*дескриптор меню */
			  hInst, /* дескриптор экземпляра программы */
			  NULL /*указатель на какую-нибудь ерунду (по другой версии - "указатель на данные создания окна")*/
			  );
	
			 if (!hMainWnd) return FALSE;  /* если создать окно почему-то не удалось   - не станем скрывать это!))*/
			 
			 ShowWindow(hMainWnd,ss); /*  показывает окно, использует только что заполненную стурктуру окна и,
                                        в качестве второго параметра - переменну полученную от системы через WinMain(),
										которая дополнительно описывает формат опять же окна.
										  */
			 UpdateWindow(hMainWnd);  /* Модифицирует клиентскую область окна*/

			 MSG msg; 
			 /* цикл обработки событий */
			 while (GetMessage(&msg,NULL,0,0)) 
			 {
				  TranslateMessage(&msg); 
				  DispatchMessage(&msg); 
			 } 
			 return msg.wParam; 
		}

		/* процедура обработки сообщений для главного окна */
		LRESULT CALLBACK MainWinProc(HWND hw,UINT msg,WPARAM wp,LPARAM lp) {
			 switch (msg) 
			 {
				  case WM_CREATE:
					   /* при создании окна внедряем в него кнопочку */
					   CreateWindow("button","Этотексткнопки",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
						5,5,100,20,hw,(HMENU)ID_MYBUTTON,NULL,NULL);
					   /* стиль WS_CHILD означает, что это дочернее окно и для него
						вместо дескриптора меню будет передан целочисленный идентификатор,
						который будет использоваться дочерним окном для оповещения 
						родительского окна через WM_COMMAND */
					   return 0;
				  case WM_COMMAND:
					   /* нажата наша кнопочка? */
					   if ((HIWORD(wp)==0) && (LOWORD(wp)==ID_MYBUTTON)) 
						MessageBox(hw,"Вы успешно нажали на кнопку!","Срочное сообщение",MB_OK|MB_ICONWARNING);
					   return 0;
				  case WM_DESTROY:
					   /* пользователь закрыл окно, программа может завершаться */
					   PostQuitMessage(0);
					   return 0;
			 }
			 return DefWindowProc(hw,msg,wp,lp);
		}

------------------------

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

для справки =

структура WNDCLASS=

UINT style - стиль (поведение) класса окон,
    WNDPROC lpfnWndProc - процедура обработки событий окна,
    int cbClsExtra - размер дополнительной памяти в системной структуре класса для данных пользователя,
    int cbWndExtra - размер дополнительной памяти в системной структуре окна для данных пользователя,
    HINSTANCE hInstance - дескриптор модуля (экземпляра программы), в котором реализована процедура обработки,
    HICON hIcon - дескриптор иконки окна,
    HCURSOR hCursor - дескриптор курсора мыши для окна,
    HBRUSH hbrBackground - дескриптор "кисточки" для закрашивания фона окна,
    LPCSTR lpszMenuName - имя ресурса, содержащего меню окна,
    LPCSTR lpszClassName - имя класса. 

Для создания окна вызывается функция:

HWND WINAPI CreateWindow(
  LPCSTR lpClassName,  /* имя класса */
  LPCSTR lpWindowName, /* имя окна (заголовок) */
  DWORD dwStyle,       /* стиль (поведение) окна */
  int x,               /* горизонтальная позиция окна на экране */
  int y,               /* вертикальная позиция окна на экране */
  int nWidth,          /* ширина окна */
  int nHeight,         /* высота окна */
  HWND hWndParent,     /* дескриптор родительского окна */
  HMENU hMenu,         /* дескриптор меню */
  HANDLE hInstance,    /* дескриптор экземпляра программы */
  LPVOID lpParam       /* указатель на какую-нибудь ерунду */
)

_____________
матфак вгу и остальная классика =)