WinAPI UI [FAQ]

Публикую это как памятку для себя и для вас, буду стараться пополнять список по мере возможности.
Задавайте свои вопросы в комментариях :)

Содержание:

Как создать окно?
Как создать диалог и использовать его в качестве главного окна?
Как получить значения элементов окна/диалога?


Очень полезные материалы:
Основы программирования для Win32 API (Алексей Соловьев)

Как создать окно


c использованием CRT (runtime library)
#include 
#include  // чтобы не было проблем с ANSI и UNICODE кодировками

// Главная функция
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 
{
 UNREFERENCED_PARAMETER(hPrevInstance);
 UNREFERENCED_PARAMETER(lpCmdLine); // если не нужна коммандая строка

 MSG Msg;

 //1. Создаем класс окна
 WNDCLASS WndClass;
 TCHAR szClassName[]=_TEXT("Garik class"); // имя класса окна
 WndClass.style=CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // cм. Window Class Styles
 WndClass.lpfnWndProc=GarikWinProc; // функция обработки сообщений окна
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hInstance=hInstance;
 WndClass.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN)); // наша иконка
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); // системный ресурс
 WndClass.hbrBackground=CreateSolidBrush(tema.cl_window.fon);
 WndClass.lpszMenuName=NULL;
 WndClass.lpszClassName=szClassName;

 if(!RegisterClass(&WndClass))
 {
  MessageBox(NULL,_TEXT("Невозможно создать класс"),NULL,MB_OK|MB_ICONERROR);
  return 0;
 }

 //2. Создаем окно. см Window Styles, Extended Window Styles
 if(!CreateWindow(WS_EX_LAYERED|WS_EX_TOOLWINDOW|WS_EX_TOPMOST,szClassName,NULL,WS_OVERLAPPEDWINDOW,
  X,Y,
  Width,Height,
  NULL,NULL,
  hInstance,NULL)) {
   MessageBox(NULL,_TEXT("Невозможно создать окно"),NULL,MB_OK|MB_ICONERROR);
   return 0;
 }

 //3. Обрабатываем сообщения окна
 while(GetMessage(&Msg,NULL,0,0))
 {
  TranslateMessage(&Msg);
  DispatchMessage(&Msg);
 } 
 return (int)Msg.wParam;
}

// Функция обработки сообщений окна
LRESULT CALLBACK GarikWinProc(HWND hWnd,UINT Message, UINT wParam, LONG lParam) 
{
 HDC hDC;
 PAINTSTRUCT PaintStruct;

 switch(Message)
 {
 case WM_PAINT:
  hDC=BeginPaint(hWnd,&PaintStruct);
  EndPaint(hWnd,&PaintStruct);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return DefWindowProc(hWnd,Message,wParam,lParam);
}
Ссылки:
Using Windows, Window Styles, Extended Window Styles, Window Class Styles

Как создать диалог и использовать его в качестве главного окна


Описание интерфейса диалога обычно содержатся в файле ресурсов rc.
Пример описания ресурса диалога:
IDD_DIALOG1 DIALOGEX 0, 0, 229, 210
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Настройки подключения к 1С"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "Сохранить",IDOK,66,191,50,14
    PUSHBUTTON      "Закрыть",IDCANCEL,174,191,50,14
    LISTBOX         IDC_LIST1,13,16,204,103,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | WS_VSCROLL | WS_TABSTOP
    GROUPBOX        "Пользователь",IDC_STATIC,7,135,217,51
    LTEXT           "Имя:",IDC_STATIC,27,151,16,8
    LTEXT           "Пароль:",IDC_STATIC,16,167,28,8
    EDITTEXT        IDC_EDIT1,47,150,170,12,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,47,167,169,12,ES_PASSWORD | ES_AUTOHSCROLL
    GROUPBOX        "Информационные базы",IDC_STATIC,7,5,217,128
    LTEXT           "",IDC_STATIC9,14,121,203,8
    PUSHBUTTON      "Удалить",IDC_BUTTON1,120,191,50,14
    PUSHBUTTON      "Импорт баз",IDOK2,7,191,55,14
END
Пример без использования CRT, предварительно нужно настроить проект:
Linker -> Advanced -> Entry Point: _entry
Linker -> Debugging -> Generate Debug Info: /NO
Linker -> Manifest File -> Generate Manifest /NO
Linker -> Input -> Ignore All Default Librares: Yes
C/C++ -> Code Generation -> Runtime Library : /MT
C/C++ -> Code Generation -> Buffer Security Check: /GS-
void _entry()
{
 DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);
 ExitProcess(0);
}

BOOL CALLBACK DialogProc(HWND hwndDlg,UINT Message, UINT wParam, LONG lParam) 
{
 switch (message) 
 { 
 case WM_COMMAND: 
  switch (LOWORD(wParam)) 
  { 
  case IDCANCEL: 
   EndDialog(hwndDlg, wParam); 
   return TRUE; 
  } 
 } 
 return FALSE; 
}
Ссылки: Dialog Box Reference

Как получить значения элементов окна/диалога?


Основные функции:
GetWindowText, GetWindowTextLength, SetWindowText
GetDlgItem, GetDlgItemInt, GetDlgItemText, SetDlgItemText, SetDlgItemInt

Ссылки:
Dialog Box Functions, Window Functions, Control Library
blog comments powered by Disqus
сюда туда