前些天犯了些错误,就是那个程序加参数运行的问题,事实不需要那么麻烦,而且WinMain的第三个参数
也是可以用的,具体用法如下:
lpCommLine = & lpCmdLine[ 0 ];
if ( ! strcmp(lpCommLine, "" )) // 无参数
::DialogBoxParam (hInst,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)DlgProc,NULL);
else if ( ! strcmp(lpCommLine, " /a " )) // 加参数 /a
::DialogBoxParam (hInst,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)DlgProcA,NULL);
return 0 ;
这样就可以了,特此说明!
再来说说对话框如何来用SkinMagic类的换肤工具来换肤的问题。
在以前看过一些用SkinMagic来换肤的例子,但它们大多都是MFC的程序,而SkinMagic中自带的SDK的
例子也是用CreateWindow/Ex系列函数来创建窗口的,并且在创建之前都会将WNDCALSS中的HMENU给设置
成合适的值(如果有的话),否则窗口成功显示后,将会没有菜单!而对于调用DialogBoxParam 系列函
数创建的对话框来说,HMENU只需要在资料设计器的简单的设置一下就可以了,此时如果你再用SkinMagic
中的示例代码来对窗口进行换肤时就会发现一个可耻的错误:菜单没有了!!那么对于那些即想使用对
话框来做主界面而又想显示菜单的开发人员来说应该怎么办呢?
于是便有了下面的代码(呼~ 呼~ !废话终于说完-_-#)
#include " resource.h "
#include " SkinMagicLib.h "
HMENU hMenuStyle,hMenu; // 需要设为全局变量,否则无法选中
HINSTANCE hInst;
LRESULT CALLBACK DlgProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInst = hInstance;
InitSkinMagicLib(hInst, " TestSkin " ,NULL,NULL);
LoadSkinFile( " corona.smf " );
// SetDialogSkin("Dialog"); // 这里不需要这个,因为后面会处理
::DialogBoxParam (hInst,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)DlgProc,NULL);
ExitSkinMagicLib();
return 0 ;
}
LRESULT CALLBACK DlgProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HICON hIcon ;
int nWpa;
switch (uMsg)
{
case WM_INITDIALOG:
// 为对话框加上菜单
hMenu = ::GetMenu(hWnd);
hMenuStyle = ::GetSubMenu (hMenu, 1 );
// 自己来构造wParam参数,并向窗口发送WM_COMMAND消息
nWpa = ( int )IDM_XPBLUE;
::SendMessage (hWnd,WM_COMMAND,nWpa,NULL);
hIcon = ::LoadIcon (NULL, " Feather2.ico " );
::SendMessage (hWnd,WM_SETICON,(WPARAM)ICON_BIG,(LPARAM)hIcon);
return true ;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_XPBLUE: // 得理在WM_INITDIALOG中发来的消息
// 将窗体风格设为XP风格
if (LoadSkinFromResource(hInst,(LPCTSTR)IDR_SKINXPBLUE1, " SKINXPBLUE " ))
{
::CheckMenuItem (hMenuStyle,IDM_XPBGREAN,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPPLUS,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPSTEEL,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPBLUE,MF_CHECKED);
SetWindowSkin(hWnd, " MainFrame " ); // 设置窗口的风格
}
break ;
case IDM_XPBGREAN:
if (LoadSkinFromResource(hInst,(LPCTSTR)IDR_SKINXPBLUE2, " SKINXPBLUE " ))
{
::CheckMenuItem (hMenuStyle,IDM_XPBGREAN,MF_CHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPPLUS,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPSTEEL,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPBLUE,MF_UNCHECKED);
SetWindowSkin(hWnd, " MainFrame " ); // 设置窗口的风格
}
break ;
case IDM_XPPLUS:
if (LoadSkinFromResource(hInst,(LPCTSTR)IDR_SKINXPBLUE3, " SKINXPBLUE " ))
{
::CheckMenuItem (hMenuStyle,IDM_XPBGREAN,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPPLUS,MF_CHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPSTEEL,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPBLUE,MF_UNCHECKED);
SetWindowSkin(hWnd, " MainFrame " ); // 设置窗口的风格
}
break ;
case IDM_XPSTEEL:
if (LoadSkinFromResource(hInst,(LPCTSTR)IDR_SKINXPBLUE4, " SKINXPBLUE " ))
{
::CheckMenuItem (hMenuStyle,IDM_XPBGREAN,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPPLUS,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPSTEEL,MF_CHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPBLUE,MF_UNCHECKED);
SetWindowSkin(hWnd, " MainFrame " ); // 设置窗口的风格
}
break ;
case IDM_OTHER:
if (LoadSkinFromResource(hInst,(LPCTSTR)IDR_SKINXPBLUE5, " SKINXPBLUE " ))
{
::CheckMenuItem (hMenuStyle,IDM_XPBGREAN,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPPLUS,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPSTEEL,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPBLUE,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_OTHER,MF_CHECKED);
SetWindowSkin(hWnd, " MainFrame " ); // 设置窗口的风格
}
break ;
case IDC_BUTTON1:
::MessageBox ( 0 , " test " , " test " , 0 );
break ;
case IDM_EXIT:
::SendMessage (hWnd,WM_CLOSE, 0 , 0 );
break ;
}
break ;
case WM_CLOSE:
::EndDialog (hWnd, 0 );
return true ;
}
return false ;
}
关键就是在WinMain中不能立即调用SetDialogSkin(或SetWindowSkin),所以我把它注释了!然后在处理WM_INITDIALOG消息时对本窗口发送一个
WM_COMMAND消息(wParam的低16位指向菜单ID,如IDM_XPBLUE),这样程序就会调用如下的代码:
case IDM_XPBLUE:// 得理在WM_INITDIALOG中发来的消息
// 将窗体风格设为XP风格
if(LoadSkinFromResource(hInst,(LPCTSTR)IDR_SKINXPBLUE1,"SKINXPBLUE"))
{
::CheckMenuItem (hMenuStyle,IDM_XPBGREAN,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPPLUS,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPSTEEL,MF_UNCHECKED);
::CheckMenuItem (hMenuStyle,IDM_XPBLUE,MF_CHECKED);
SetWindowSkin(hWnd,"MainFrame");//设置窗口的风格
}
break;
当然在运行这段代码前必须先将皮肤文件以资源的形式导入,在此就不多说!
全文完!欢迎讨论