[WinAPI] Cum initializam controalele comune?

Folosire Windows API in programe C/C++ (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[WinAPI] Cum initializam controalele comune?

Post by Ovidiu Cucu » 13 Jun 2008, 11:57

Problema
Am o aplicatie Win32 in care creez un dialog cu diferite controale. Functioneaza perfect pana cand adaug, sa zicem, un listview. Dialogul nu mai apare, iar functia care ar trebui sa-l creeze intoarce eroare (de exemplu DialogBox
intoarce -1). Mai mult, daca pun un apel la GetLastError, acesta intoarce 0 (zero), nedandu-mi astfel nici o informatie.

Rezolvare
Trebuie sa initializam (inregistram) controalele respective. O solutie este un apel la functia InitCommonControls. Este o solutie simpla pentru ca face totul "dintr-un foc". Totusi, in documentatie se spune ca aceasta functie este invechita (obsolete) si se recomanda folosirea lui InitCommonControlsEx.
Deci ca sa rezolvam problema trebuie sa facem urmatoarele:
  • includem headerul commctrl.h;
  • legam proiectul la comctl32.lib in proprietatile pentru linker sau utilizand directiva #pragma comment;
  • apelam functia InitCommonControlsEx pentru a initializa controalele necesare.

Exemplu

Code: Select all

#include <windows.h>
#include <commctrl.h>
#include "resource.h"

BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void RegisterCommonControls();
#pragma comment(lib, "comctl32.lib")

void RegisterCommonControls()
{
  INITCOMMONCONTROLSEX iccex = {0};

  iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
  iccex.dwICC  = ICC_LISTVIEW_CLASSES;  // list view and header control classes 
                                        // see INITCOMMONCONTROLSEX in MSDN for a complete list
  InitCommonControlsEx(&iccex);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  RegisterCommonControls();
  INT_PTR nRet = DialogBox(hInstance,                    // handle to module
                           MAKEINTRESOURCE(IDD_DIALOG1), // dialog box template
                           NULL,                         // handle to owner window
                           DialogProc);                  // dialog box procedure
  return 0;
}
Note:
  1. Lista cu flag-urile care seteaza care controale vor fi initializate se gaseste in MSDN la documentatia pentru structura INITCOMMONCONTROLSEX sau direct in headerul commctrl.h.
  2. Un loc mai aparte reprezinta controlul rich edit. Pentru initiaslizarea acestuia se foloseate functia LoadLibrary cu care se incarca RICHED32.DLL (rich edit versiunea 1.0) sau RICHED20.DLL (rich edit versiunea 2.0 sau 3.0).
Vezi si
<< Back to Windows API Index
Last edited by Ovidiu Cucu on 08 Aug 2011, 19:55, edited 6 times in total.
Reason: Am adaugat notele



Post Reply