2010-12-17 7 views
5

Ich habe mehrere Websites, Dokumente und Tutorials durchlaufen und alle sagen dasselbe, das heißt, jedes Steuerelement ist nichts anderes als ein Fenster in Win32s API, daher kann man die CreateWindowExW()-Funktion verwenden, um ein ListBox Steuerelement zu erstellen. Fenster über dem Hauptanwendungsfenster.Win32: Erstellen eines ListBox-Steuerelements mithilfe der CreateWindowExW() - Funktion?

Obwohl ich die Konzepte von allen Kontrollen erhalten sind Fenster mit verschiedenen dwStyle, ich habe eine harte Zeit, herauszufinden, wie, zu instanziiert zu sagen so, die ListBox Kontrolle.

traf ich ein Tutorial, in dem ein Dialog, in seiner Erklärung ein LISTBOX angegeben zu haben, wird wie folgt geschrieben:

// resource.h 
#define IDD_MAIN      101 
#define IDC_TEXT      1000 
#define IDC_NUMBER      1001 
#define IDC_LIST      1002 
#define IDC_ADD       1003 
#define IDC_CLEAR      1004 
#define IDC_REMOVE      1005 
#define IDC_SHOWCOUNT     1006 

// .rc resource file 
IDD_MAIN DIALOG DISCARDABLE 0, 0, 207, 156 
    STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU 
    CAPTION "Controls One" 
    FONT 8, "MS Sans Serif" 
BEGIN 
    LTEXT   "Add",IDC_STATIC,7,10,14,8 
    EDITTEXT  IDC_TEXT,25,7,120,14,ES_AUTOHSCROLL 
    EDITTEXT  IDC_NUMBER,150,7,21,14,ES_NUMBER 
    LTEXT   "times.",IDC_STATIC,177,10,23,8 
    LISTBOX   IDC_LIST,7,25,138,106,LBS_NOINTEGRALHEIGHT | 
        LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP 
    PUSHBUTTON  "&Add",IDC_ADD,150,30,50,14 
    PUSHBUTTON  "&Remove",IDC_REMOVE,150,47,50,14 
    PUSHBUTTON  "&Clear",IDC_CLEAR,150,63,50,14 
    LTEXT   "This item was added",IDC_STATIC,7,141,66,8 
    CTEXT   "-",IDC_SHOWCOUNT,77,141,32,8 
    LTEXT   "times",IDC_STATIC,114,141,17,8 
END 

Und es in seinem C-Programm wie so mit:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc); 
} 

Jetzt, das kann ich machen und die Konzepte verstehen. Abgesehen davon möchte ich in der Lage sein, mein Hauptanwendungsfenster zu erstellen und zu gestalten, um eine ListBox Steuerung hinzuzufügen. In diesem Lernprogrammbeispiel wird nicht die CreateWindowExW()-Funktion zum Erstellen des Steuerelements verwendet, sondern ein Dialogfeld, das eigentlich das Hauptanwendungsfenster ist.

1 - Irgendwelche Hinweise, wie man ein ListBox Steuerelement zum Hauptfenster im Code hinzufügt?

Ich dachte über die Erstellung der WM_CREATE Nachricht.

2 - Ist das eine gute Idee?

3 - Was ist die beste Vorgehensweise in diesem Szenario?

+0

diese Art von Code zu schreiben, ist nie eine gute Idee, es gibt viele ausgezeichnete Klassenbibliotheken zur Verfügung, die nehmen die Langeweile und die Fehler daraus. Es ist in Ordnung, wenn Sie die Assemblersprache von Win32 lernen möchten. Keine sehr zwingende SO Frage. –

+1

Ich plane nicht, ein vollständiges Unternehmenssystem mit Win32 zu schreiben. Ich liebe C und wollte immer mehr über die Win32 wissen. Zu Beginn meines Programmierstudiums waren die Win32s zu komplex, um sie zu lernen. Heute verstehe ich die Konzepte, die hinter mir liegen, vollständig, so dass ich leichter lernen kann. Da das .NET Framework auf den Win32s basiert, möchte ich mehr darüber erfahren. –

Antwort

9

Um ein Steuerelement dynamisch in Win32 ist zu erstellen Sie den folgenden Code benötigen:

HWND hBtn 
    , hLabel 
    , hListbox 
    , hTextBox; 

void InitializeComponent(HWND hWnd) { 
    HINSTANCE hInstance = GetModuleHandle(NULL); 

    // Adding a Button. 
    hBtn = CreateWindowExW(WS_EX_APPWINDOW 
     , L"BUTTON", NULL 
     , WS_CHILD | WS_VISIBLE 
     , 327, 7, 70, 21 
     , hWnd, NULL, hInstance, NULL);   

    SetWindowTextW(hBtn, L"&Button"); 

    // Adding a Label. 
    hLabel = CreateWindowExW(WS_EX_CLIENTEDGE 
     , L"STATIC", NULL 
     , WS_CHILD | WS_VISIBLE 
     , 7, 7, 50, 21 
     , hWnd, NULL, hInstance, NULL); 

    SetWindowTextW(hLabel, L"Label:"); 

    // Adding a ListBox. 
    hListBox = CreateWindowExW(WS_EX_CLIENTEDGE 
     , L"LISTBOX", NULL 
     , WS_CHILD | WS_VISIBLE | ES_VSCROLL | ES_AUTOVSCROLL 
     , 7, 35, 300, 200 
     , hWnd, NULL, hInstance, NULL); 

    // Adding a TextBox. 
    hTextBox = CreateWindowExW(WS_EX_CLIENTEDGE 
     , L"EDIT", NULL 
     , WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL 
     , 62, 7, 245, 21 
     , hWnd, NULL, hInstance, NULL); 

    SetWindowTextW(hTextBox, L"Input text here..."); 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { 
    switch (Msg) { 
     case WM_CREATE: 
      InitializeComponent(hWnd); 
      break;    
     default: 
      return DefWindowProcW(hWnd, Msg, wParam, lParam); 
    } 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { 
    // Declaring, defining, registering and creating window here... 
    // Note that each Window/Control has to have its own Message handling function. 
} 
+0

Sie sollten das wirklich korrigieren, sonst verursacht dieses Q & A mehr Schaden, als es hilft. Ich nehme an, Sie haben dies gepostet, ohne den Code bis zum 25. Juni 2013 erneut zu betrachten und um Hilfe bei cplusplus gebeten zu haben. Ich würde gerne die echte Lösung auch sehen :) – Sam

+0

Es tut mir leid, ich könnte dich für jemand anderen hier verwechseln. Dieser Code enthält jedoch definitiv Fehler, wie das Verwenden von Bearbeitungssteuerelementen in einem List-Feldsteuerelement und verwirrenden Zeichenfolientypen. – Sam

+0

Ich frage mich, wie Sie mich mit jemand anderem verwechseln können. Dieser Code ist nicht C++, sondern Win32. –

2
HWND hListBox; // Handle for list box control 

hListBox = CreateWindowEx(
    WS_EX_CLIENTEDGE, // extended window styles 
    "LISTBOX", // list box window class name 
    NULL, 
    WS_CHILD | WS_VISIBLE, // window styles 
    7, // horizontal position 
    35, // vertical position 
    300, // width 
    200, // height 
    hWnd, 
    NULL, 
    hInstance, 
    NULL 
); 

if (!hListBox){ 
    // failed to create list box window - take actions ... 
} 
+0

Worin unterscheidet sich das von dem Code, den ich bereits in meiner Antwort angegeben habe? –

+2

Alles, was nicht wichtig ist, um ein Listenfeld-Steuerelement zu erstellen, wurde entfernt. CreateWindowEx() wird anstelle von CreateWindowExW() und "L" LISTBOX "" verwendet, was die Einfachheit erhöht. Die Bearbeitungssteuerungsstile ES_VSCROLL und ES_AUTOVSCROLL werden weggelassen, da sie für Listenfeldsteuerelemente nicht verwendbar sind (soweit ich weiß). Es wurde eine Fehlerprüfung hinzugefügt, was sehr wichtig ist, damit eine Schnittstelle kein fehlendes Steuerelement toleriert. – Sam

+1

@Sam: Welche Besetzung? Und Ihre Projekte funktionieren nicht in Projekten, bei denen "UNICODE" definiert ist. Die Funktion, die eine einfache Nicht-Unicode-Zeichenfolge akzeptiert, heißt CreateWindowExA. –

Verwandte Themen