SkinMagic的一点使用经验,特此共享!

前些天犯了些错误,就是那个程序加参数运行的问题,事实不需要那么麻烦,而且WinMain的第三个参数
也是可以用的,具体用法如下:

 

hInstance  =  hInst;
 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  " stdafx.h "
#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; 
当然在运行这段代码前必须先将皮肤文件以资源的形式导入,在此就不多说!
全文完!欢迎讨论  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值