问题描述
||
C ++ Win32,如何向Win32对话框添加下拉菜单
你好
这是我第一次将问题发布到stackoverflow。
我试图将组合框(在menu.cpp中)添加到Win32对话框(在fingerpell.cpp中)。我不太会Win32
编程和大多数msdn示例片段在窗口内绘制一个组合框。即使DialogBox在技术上
一个窗口,但是在修改任何窗口示例代码以处理DialogBox方面我没有什么进展。我非常感谢一个可行的例子。
该代码的大致示意图如下。 fingerpell.cpp创建实现WinMain函数,然后调用
其他自定义类在此DialogBox中绘制。没有使用其他窗口控件,如按钮,文本区域等。
fingerpell.cpp的代码是
#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\",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;
}
menu.cpp的代码。我试图添加组合框的文件。
#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,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 );
}
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 );
}
谢谢。
解决方法
http://www.resedit.net/
我认为它比Visual Studio编辑器(仅专业提供)要好
,在Vista或更高版本上,使用简单的BS_SPLITBUTTON样式的按钮控件(WC_BUTTON),然后处理BCN_DROPDOWN来创建菜单。
我尚未尝试过此实际代码,但此示例看起来很合理:http://www.codereflect.com/2009/02/19/how-to-create-a-drop-down-button-in-windows- vista-7 /
马丁