C++ Win32, Cómo agregar un menú desplegable a un Win32 DialogBoxC++ Win32, Cómo agregar un menú desplegable a un Win32 DialogBox
Hola,
Esta es la primera vez quesiton a stackoverflow publicación.
Estoy tratando de agregar combobox (en menu.cpp) a un Win32 Dialogbox (en fingerspell.cpp). No soy muy fluido en la programación de Win32 y la mayoría de los fragmentos de ejemplo msdn dibujan un cuadro combinado dentro de una ventana. Aunque Dialogbox es técnicamente una ventana, no he progresado mucho en la modificación de ningún código de ejemplo de ventana para manejar un DialogBox. Realmente apreciaría un ejemplo de trabajo.
Un boceto del código es el siguiente. fingerspell.cpp crea implementa la función WinMain y luego llama a otras clases personalizadas para dibujar dentro de este DialogBox. No se utilizan otros controles de ventana, como botones, área de texto, etc.
códigopara fingerspell.cpp es
#include "fingerspell.h"
extern "C" __declspec(dllexport)bool isGloveDriverInstalled();
extern "C" __declspec(dllimport)bool initialize();
#define RUN(x) if (SUCCEEDED(result)) { result = x; }
BOOL g_fullscreen = FALSE;
bool portReady;
INT_PTR CALLBACK OptionDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_INITDIALOG:
if (wParam == IDOK)
return TRUE ;
else
return FALSE ;
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED) {
if (LOWORD(wParam) == IDOK) {
g_fullscreen = TRUE;
EndDialog (hwndDlg, 1) ;
}
else if (LOWORD(wParam) == ID_WINDOW_OPT) {
g_fullscreen = FALSE;
EndDialog (hwndDlg, 1) ;
}
else {
EndDialog (hwndDlg, 0) ;
}
return TRUE ;
}
default:
return FALSE;
break ;
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
INT_PTR DispOption = DialogBox (hInstance, MAKEINTRESOURCE(IDD_DISPLAY_OPTIONS), NULL, OptionDialogProc) ;
if (DispOption == 0)
return 0 ;
//srand(GetTickCount());
HRESULT result = S_OK;
if (!isGloveDriverInstalled())
{
portReady = FALSE;
MessageBox(NULL, "The Glove Driver is not istalled ", "Error", MB_OK);
}
else
{
if (!initialize())
{
portReady = FALSE;
MessageBox(NULL, "Error Opening Com Port", "Error", MB_OK);
}
else
{
portReady = TRUE;
}
}
RUN(Words ::Create ("default.txt"));
RUN(Window::Create ());
RUN(Render::Create ());
RUN(Art ::Create ());
RUN(Menu ::Create ());
RUN(Window::MessageLoop());
RUN(Menu ::Destroy ());
RUN(Art ::Destroy ());
RUN(Render::Destroy ());
RUN(Window::Destroy ());
RUN(Words ::Destroy ());
if (FAILED(result))
{
MessageBox(GetDesktopWindow(), "Warning - Fail Code Detected", "Fingerspell 2002", MB_ICONWARNING | MB_OK);
}
return result;
}
código para menu.cpp. archivo donde trato de agregar combobox.
#include "fingerspell.h"
#include <windows.h> //include all the basics
#include <tchar.h> //string and other mapping macros
#include <string>
HRESULT Menu::Create()
{
// set menu as the background
Render::SetBackground(ART_MENU);
// clear overlay
Render::Reset();
Window::SetProc(Proc);
return S_OK;
}
HRESULT Menu::Destroy(void)
{
return S_OK;
}
LRESULT CALLBACK Menu::Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DWORD i ;
const static RECT button_rect[ 8 ] =
{
{ 52, 139, 52 + 101, 139 + 50 }, //1. about
{ 55, 212, 55 + 85, 212 + 50 }, // 2. learn
{ 67, 280, 67 + 63, 280 + 50 }, // 3. exit
{ 397, 137, 397+ 233, 137 + 50 }, // 4. Add Delete List.
{ 421, 187, 421+ 183, 187 + 50 }, // 5. add word
{ 413, 247, 413+ 201, 247 + 50 }, // 6. delete word
{ 450, 300, 450+ 124, 300 + 50 }, // 7. practice
{ 473, 349, 473 + 82, 349 + 50 }, // 8. test
};
// custom message processing
switch (uMsg)
{
case WM_CREATE:
return OnCreate(hwnd,reinterpret_cast<CREATESTRUCT*>(lParam));
case WM_MOUSEMOVE: // move is moved, see where is it pointing to.
{
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
for (i = 0; i < 8; i++)
{
if (xPos >= button_rect[ i ].left && yPos >= button_rect[ i ].top)
{
if (xPos < button_rect[ i ].right && yPos < button_rect[ i ].bottom)
{
// set selection
Render::SetOverlay(0, (ART) (ART_MENU_LEARN + i), button_rect[ i ].left, button_rect[ i ].top);
break;
}
}
}
if (i == 8)
{
//remove selection
Render::SetOverlay(0, ART_NULL, 0, 0);
}
return 0;
}
case WM_LBUTTONDOWN:
{
switch (Render::GetOverlay(0))
{
case ART_MENU_EXIT: // done.
{
Menu::Destroy();
Learn::Create();
break;
}
case ART_MENU_LEARN: // done
{
Menu::Destroy();
About::Create();
break;
}
case ART_MENU_ABOUT: // done
{
Menu::Destroy();
Test::Create();
break;
}
case ART_MENU_TEST: // done.
{
Menu::Destroy();
Practice::Create();
break;
}
case ART_MENU_DELETEWORD: // done
{
Menu::Destroy();
AddWord::Create();
break;
}
case ART_MENU_ADDDELETELIST:
{
//Menu::Destroy() ;
PostQuitMessage(0);
break;
}
case ART_MENU_ADD:
{
Menu::Destroy();
// About is place holder. should be AddDELETELIST
About::Create();
break;
}
case ART_MENU_PRACTICE: // done.
{
Menu::Destroy();
// About is place holder. shd be DELETEWORD.
About::Create();
break;
}
}
return 0;
}
}
// default message processing
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
Thanks.
¿Está utilizando Visual Studio? Tiene un editor que te permitirá arrastrar y soltar controles. – Jay