Заметки по WinAPI

  • модальные немодальные диалоги, создание уничтожение
    • модальный диалог - блокирует приложение до тех пор, пока не завершится или пока не вызовется его завершающая функция
    • немодальный диалог - не блокирует приложение, требует модфикации оконной процедуры (проверка, является ли соощение диалоговым при помощи IsDialogMessage)
      • IsDialogMessage - определяет, предназначено ли это сообщение диалоговому окну, и если да, то обрабатывает его
      • возвращает не 0 если сообщение было обработано
      • 0 если не было
      • несмотря на то, что она в основном предназначена для немодальных диалогов, ее можно использовать для любых окон, для определения поведения при навигации по контролам окна
      • конвертирует сообщения с клавиатуры типа Tab & Arrows в сообщения о смене фокуса для данного диалога
      • как раз из-за этих преобразований и нельзя потом это сообщение передавать в translate & dispatch
    • диалоговый класс окна
      • №32770 (у него реально тупо нету имени:)
    • возвращение из диалога чего-то нетривиального:
      • прямо перед возвращением TRUE из диалога сделать ::SetWindowLong( DialogHandle, DWL_MESSAGE_RESULT, lResult );
      • делание раньше опасно тем, что какой-нибудь другой диалог может переписать это значение
    • создание и уничтожение модального диалога nResult DialogBox( HINSTANCE, DIALOG_TEMPlATE_RESOURCE, HWND parent, dialogProc)
      • возвращаемое значение nResult которое надо передать в EndDialog EndDialog( HWND, nResult ) // уничожает диалог
    • у немодального CreateDialog( те же параметры )
      • возвращает хэндл диалога DestroyWindow( ) // уничтожает диалог суффиксы имен функций создания каких-либо диалогов
      • Param - передача парметра 9он передается с сособщением WM_INITDIALOG
      • Indirect - сшаблон принимается не из ресурсо, а из памяти при помощи структуры DLGTEMPLATE typedef struct { DWORD style; // стили окна или диалога DWORD dwExtendedStyle; // расширенные стили (как у окон) WORD cdit; // кол-во контролов у диалога (это используется как кол-во ) short x; // short y; short cx; short cy; } DLGTEMPLATE, *LPDLGTEMPLATE; // далее идет лютое задротство
      • вслед за диалогом в памяти должны располагаться массивы
        • инфа о меню
          • 0x000 - если ничего нет
          • 0xFFF .... - надо грузить из ресурса, записанного в ....
        • класс окна
          • просто строка
        • заголовк
          • еще строка
        • притом элементы 16-битные,но выровнены должны быть по WORD
        • также если установлен стиль DS_SETFONT
          • информация о шрифте (16-битное число означающее размер + typeface name e.g. "MS Shell Dlg")
      • а затем DLGITEMTEMPLATE (в кол-ве cdit штук) // притом за каждым итемом должны также следовать имя/класс и тд. // но, к счастью, это все задротство касается лишь загрузки диалога из памяти // а здесь пусть лежит пример template из rc файла SETTINGS_DIALOG DIALOGEX 0, 0, 165, 167 STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Settings" FONT 8, "Times New Roman" BEGIN
          PUSHBUTTON      "Цвет шрифта",BUTTON_FONTCOLOR,17,18,54,14
          LTEXT           "Прозрачность",TRANSPARENCY_LABEL,15,52,48,8
          PUSHBUTTON      "Цвет фона",BUTTON_BCKGCOLOR,87,18,58,14
          CONTROL         "Прозрачность",TRANSPARENCY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,63,151,15
          LTEXT           "Размер шрифта",FONTSIZE_LABEL,15,88,53,8
          CONTROL         "Размер шрифта",FONTSIZE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,98,151,15
          CONTROL         "Предпросмотр",PREVIEW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,119,71,10
          DEFPUSHBUTTON   "OK",BUTTON_OK,15,137,50,14,BS_FLAT
          PUSHBUTTON      "Cancel",BUTTON_CANCEL,95,137,50,14,BS_FLAT
        
        END // еще поигрался со шрифтами (Tahoma, Times New Roman и т д.:-) // размеры и единица кородинат измеряются в некоторых диалоговых юнитах (притом размер самого диалогового юнита изменяется от шрифта) // ведь диалоговый юнит у нас // TABSTOP - лаг остановки таба // PUSHBUTTON - дефолтный контроллер // TAB пробегает элементы сверху вниз по ресурсовому файлу
  • истемные диалоги

    • ::ChooseColor, ::ChooseFont, ::GetSave(Open)FileName, ::PrintDlg
    • все они построены по принципу
      • принимюат один укзаатель на структуру
      • возвращают BOOL
      • выбранное значение лежит вполе структуры
    • структуры typedef struct {

        DWORD        lStructSize;
        HWND         hwndOwner;
        HDC          hDC;            // IGNORED BY CHOOSE FONT
        LPLOGFONT    lpLogFont;        // структура, содержащая информацию о шрифте (при CS_INITTOLOGFONTSTRUCT - заполнится после завершения диалога)
        INT          iPointSize;    // размер шрифта
        DWORD        Flags;            // флаги
        COLORREF     rgbColors;        // 
        LPARAM       lCustData;        // данные передаваемые через WM_INITDIALOG в hook procedure
        LPCFHOOKPROC lpfnHook;        // при CF_ENABLEHOOK hook procedure
        LPCTSTR      lpTemplateName;// при CF_ENABLETEMPLATE имя шаблона диалога
        HINSTANCE    hInstance;        // при CF_ENABLETEMPLATE hInstance содержащий шаболн диалога 
        LPTSTR       lpszStyle;        // при CF_USESTYLE свой FontStyle ComboBox
        WORD         nFontType;        // тип шрифта, после возврата значения диалога (screen/printer/bold/italic)
        INT          nSizeMin;
        INT          nSizeMax;
      

      } CHOOSEFONT, *LPCHOOSEFONT;

      typedef struct tagPD {

        DWORD           lStructSize;
        HWND            hwndOwner;
        HGLOBAL         hDevMode;
        HGLOBAL         hDevNames;
        HDC             hDC;
        DWORD           Flags;
        WORD            nFromPage;
        WORD            nToPage;
        WORD            nMinPage;
        WORD            nMaxPage;
        WORD            nCopies;
        HINSTANCE       hInstance;
        LPARAM          lCustData;
        LPPRINTHOOKPROC lpfnPrintHook;
        LPSETUPHOOKPROC lpfnSetupHook;
        LPCTSTR         lpPrintTemplateName;
        LPCTSTR         lpSetupTemplateName;
        HGLOBAL         hPrintTemplate;
        HGLOBAL         hSetupTemplate;
      

      } PRINTDLG, *LPPRINTDLG;

      typedef struct tagOFN {

        DWORD         lStructSize;
        HWND          hwndOwner;
        HINSTANCE     hInstance;
        LPCTSTR       lpstrFilter;
        LPTSTR        lpstrCustomFilter;
        DWORD         nMaxCustFilter;
        DWORD         nFilterIndex;
        LPTSTR        lpstrFile;
        DWORD         nMaxFile;
        LPTSTR        lpstrFileTitle;
        DWORD         nMaxFileTitle;
        LPCTSTR       lpstrInitialDir;
        LPCTSTR       lpstrTitle;
        DWORD         Flags;
        WORD          nFileOffset;
        WORD          nFileExtension;
        LPCTSTR       lpstrDefExt;
        LPARAM        lCustData;
        LPOFNHOOKPROC lpfnHook;
        LPCTSTR       lpTemplateName;
        #if (_WIN32_WINNT >= 0x0500)
        void          *pvReserved;
        DWORD         dwReserved;
        DWORD         FlagsEx;
        #endif 
      

      } OPENFILENAME, *LPOPENFILENAME;

      typedef struct {

        DWORD        lStructSize;
        HWND         hwndOwner;
        HWND         hInstance;
        COLORREF     rgbResult;
        COLORREF     *lpCustColors;
        DWORD        Flags;
        LPARAM       lCustData;
        LPCCHOOKPROC lpfnHook;
        LPCTSTR      lpTemplateName;
      

      } CHOOSECOLOR, *LPCHOOSECOLOR;

  • side-by-side assembly & XP-Manifests
    • side-by-side assembly - некоторая сборка ресурсов ( DLL, классы окон, COM сервера, библиотеки типов, интерфейсов ), которые всегда поставляются приложению вместе
      • обычно такая сборка состоит из одной DLL
      • и обычно у сборки стоит версия, что позволяет импортировать правильные версии ресурсов
      • например готовые XP сборки
        • Shell Common Controls v 6.0 (Comctl32.dll)
        • GDI Plus v 1.0 (GDIplus.dll)
        • Visual C++ Run-time Libraries v 6.0
      • для своей сборки пишется свой XML файл, если его поместить в директория WinSxS то сборка будет глобальной, если тв проект - то приватной
    • XML-файл в котором это описывается называется Manifest