前些天犯了些错误,就是那个程序加参数运行的问题,事实不需要那么麻烦,而且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;
当然在运行这段代码前必须先将皮肤文件以资源的形式导入,在此就不多说!
全文完!欢迎讨论