2010-12-17 17 views
5

He estado en múltiples sitios, documentos y tutoriales y todos dicen lo mismo, es decir, cualquier control no es más que una ventana en la API de Win32, por lo tanto uno puede usar la función CreateWindowExW() para crear un control ListBox/ventana sobre la ventana principal de la aplicación.Win32: ¿Cómo crear un control ListBox usando la función CreateWindowExW()?

Aunque consigo los conceptos de todos los controles son ventanas con diferentes dwStyle, que tienen dificultades para encontrar la manera de crear una instancia, por decirlo así, el control ListBox.

me encontré con un tutorial donde un diálogo escrito para tener una LISTBOX señalados en su declaración de la siguiente manera:

// 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 

Y su uso en su programa de C, así:

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

Ahora, esto soy capaz de hacer y comprender completamente los conceptos. Además, me gustaría poder crear y diseñar la ventana principal de mi aplicación para agregar un control ListBox. Este ejemplo tutorial no usa la función CreateWindowExW() para crear el control, sino que crea un cuadro de diálogo que en realidad será la ventana principal de la aplicación.

1 - ¿Alguna pista sobre cómo agregar un control ListBox a la ventana principal en el código?

Pensé en crearlo mientras manejaba el mensaje WM_CREATE.

2 - ¿Es esta una buena idea?

3 - ¿Cuál es la mejor práctica/enfoque en este escenario?

+0

Escribir este tipo de código nunca es una buena idea, hay un montón de librerías de clases excelentes disponibles que tienen el tedio y los errores de esto. Está bien si quieres aprender el lenguaje ensamblador de Win32. Aunque no es una pregunta muy convincente. –

+1

No pienso escribir un sistema empresarial completo utilizando Win32. Amo a C, y siempre quise saber más sobre Win32. Al principio de mis estudios de programación, Win32 era demasiado complejo para aprender. Hoy, entiendo por completo los conceptos que hay detrás, así que es más fácil para mí aprender. Dado que .NET Framework se basa en Win32, deseo obtener más información al respecto. –

Respuesta

9

Con el fin de crear dinámicamente un control en Win32 de lo que necesita el siguiente código:

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

Realmente debería corregir esto, de lo contrario, este Q & A causa más daño de lo que ayuda. Supongo que publicaste esto sin mirar el código otra vez hasta el 25 de junio de 2013, pidiendo ayuda nuevamente en cplusplus. Me gustaría ver la verdadera solución también :) – Sam

+0

Lo siento, podría confundirte por alguien más aquí. Sin embargo, este código definitivamente contiene errores, como el uso de estilos de control de edición en un control de cuadro de lista y tipos de cadena confusos. – Sam

+0

Me pregunto cómo puedes confundirme con alguien más. Este código no es C++, sino 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

¿En qué es esto diferente del código que ya proporcioné en mi respuesta, dígame? –

+2

Todo lo que no es importante para crear un control de cuadro de lista se elimina. Se usa CreateWindowEx() en lugar de CreateWindowExW() y el molde 'L" LISTBOX "', lo que agrega simplicidad. Los estilos de control de edición ES_VSCROLL y ES_AUTOVSCROLL se omiten, ya que no se pueden usar para los controles de cuadro de lista (hasta donde sé). Se agregó una verificación de errores, que es muy importante para una interfaz que no tolera ningún control faltante. – Sam

+1

@Sam: ¿Qué emiten? Y el tuyo no funcionará en proyectos con 'UNICODE' definido. La función que acepta una cadena simple no Unicode se llama 'CreateWindowExA'. –

Cuestiones relacionadas