织梦CMS - 轻松建站从此开始!

罗索

Windows Mobile 6.5 控件风格

落鹤生 发布于 2010-07-25 16:44 点击:次 
在做Windows Mobile 6.5自绘listview时,当菜单选中时,为达到与WM6.5统一的风格,在文档中没有找到相应绘制listview 选中状态的函数。通过分析,绘制函数必定在coredll中,查找coredll.def文件,发现三个函数。
TAG:

引:在做Windows Mobile 6.5自绘listview时,当菜单选中时,为达到与WM6.5统一的风格,在文档中没有找到相应绘制listview 选中状态的函数。通过分析,绘制函数必定在coredll中,查找coredll.def文件,发现三个函数。

关于设置默认listview控件的方法见如下:

 

The secret is in the extended style LVS_EX_THEME that needs to be applied to a ListView. It could be done by sending LVM_SETEXTENDEDLISTVIEWSTYLE to the control. I've wrapped appropriate P/Invoke calls in the following extention method:

 

 const int LVS_EX_THEME = 0x02000000;

/// <summary>

/// Sets theme style to a listview

/// </summary>

/// <param name="listView">ListView instance</param>

public static void SetThemeStyle(this ListView listView)

{

     // Retreive the current extended style

     int currentStyle = SendMessage(listView.Handle,

                                  (uint)LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);

     // Assign the LVS_EX_THEM style

     SendMessage(listView.Handle, (uint)LVM_SETEXTENDEDLISTVIEWSTYLE, 0,

currentStyle | LVS_EX_THEME);          

}

 

But wait there's more... While looking up the values for the P/Invoke messages in the commctrl.h, my eyes cought the forgotten LVM_SETBKIMAGE message which could be used to assign a background image to a ListView. This is how another extention method would look like:

/// <summary>

/// Sets background image to a listview

/// </summary>

/// <param name="listView">ListView instance.</param>

/// <param name="path">string path to an image.</param>

public static void SetBackgroundImage(this ListView listView, string path)

{

      // Create bitmap

      Bitmap bitmap = new Bitmap(path);

      // Retrieve HBITMAP

      IntPtr hBitmap = bitmap.GetHbitmap();

      // Dispose the managed bitmap

      bitmap.Dispose();

      // Prepare structure

      LVBKIMAGE lvImage = new LVBKIMAGE();

      lvImage.hbm = hBitmap;

      lvImage.ulFlags = LVBKIF_SOURCE_HBITMAP;

      // Assign an image

      SendMessage(listView.Handle, LVM_SETBKIMAGE, 0, ref lvImage);

 

 }

 

 

UpdateThemePrimitives

DrawThemePrimitive

ThemePrimitiveExists。

使用方法很简单,见头文件。

typedef enum tagThemePrimitiveType
{
 ThemePrimitive_Invalid = -1,
 ThemePrimitive_Bubble_Border,
 ThemePrimitive_Bubble_Title,
 ThemePrimitive_ListView_Selector,
 ThemePrimitive_Menu_Border,
 ThemePrimitive_Menu_UpArrowBackground,
 ThemePrimitive_Menu_UpArrow,
 ThemePrimitive_Menu_UpArrowDisabled,
 ThemePrimitive_Menu_DownArrowBackground,
 ThemePrimitive_Menu_DownArrow,
 ThemePrimitive_Menu_DownArrowDisabled,
 ThemePrimitive_Menu_Selector,
 ThemePrimitive_MessageBox_Border,
 ThemePrimitive_MessageBox_Caption,
 ThemePrimitive_ScrollBar_Vertical_Track,
 ThemePrimitive_ScrollBar_Vertical_Thumb,
 ThemePrimitive_ScrollBar_Vertical_UpArrowButton,
 ThemePrimitive_ScrollBar_Vertical_UpArrowButtonSelected,
 ThemePrimitive_ScrollBar_Vertical_UpArrowButtonDisabled,
 ThemePrimitive_ScrollBar_Vertical_DownArrowButton,
 ThemePrimitive_ScrollBar_Vertical_DownArrowButtonSelected,
 ThemePrimitive_ScrollBar_Vertical_DownArrowButtonDisabled,
 ThemePrimitive_ScrollBar_Horizontal_Track,
 ThemePrimitive_ScrollBar_Horizontal_Thumb,
 ThemePrimitive_ScrollBar_Horizontal_LeftArrowButton,
 ThemePrimitive_ScrollBar_Horizontal_LeftArrowButtonSelected,
 ThemePrimitive_ScrollBar_Horizontal_LeftArrowButtonDisabled,
 ThemePrimitive_ScrollBar_Horizontal_RightArrowButton,
 ThemePrimitive_ScrollBar_Horizontal_RightArrowButtonSelected,
 ThemePrimitive_ScrollBar_Horizontal_RightArrowButtonDisabled,
 ThemePrimitive_SoftKeyBar_Background,
 ThemePrimitive_SoftKeyBar_SoftKeyHighlight,
 ThemePrimitive_SoftKeyBar_SipHighlight,
 ThemePrimitive_TabView_Edge,
 ThemePrimitive_TabView_Edge_Shadow,
 ThemePrimitive_TaskBar_Background,
 ThemePrimitive_TaskBar_Highlight,
 ThemePrimitive_Toast_Border,
 ThemePrimitive_Toast_Title,
 ThemePrimitive_Toast_LeftArrowSpinner,
 ThemePrimitive_Toast_RightArrowSpinner,
 ThemePrimitive_UpDownControl_LeftArrowButton,
 ThemePrimitive_UpDownControl_LeftArrowButtonSelected,
 ThemePrimitive_UpDownControl_RightArrowButton,
 ThemePrimitive_UpDownControl_RightArrowButtonSelected,
 ThemePrimitive_UpDownControl_UpArrowButton,
 ThemePrimitive_UpDownControl_UpArrowButtonSelected,
 ThemePrimitive_UpDownControl_DownArrowButton,
 ThemePrimitive_UpDownControl_DownArrowButtonSelected,
 ThemePrimitive_Count
} THEMEPRIMITIVETYPE;

/*
* Theme primitive APIs
*/

// Updates all the theme primitives
WINUSERAPI
void
WINAPI
UpdateThemePrimitives(
       void
       );

// Draw a theme primitive (specified by its index) into a specified RECT area of a DC
// Note: if the DC passed in is NULL, this method fills bitmap rect info to  prc, then
// return TRUE.
WINUSERAPI
BOOL
WINAPI
DrawThemePrimitive(
       THEMEPRIMITIVETYPE tpt,
       HDC hdc,
       LPRECT prc
       );

// Returns TRUE if the theme primitive (specified by its index) exists and is enabled.
// A theme primitive exists if it has a non-zero HDC. Theme primitives are disabled if
// layered windows are disabled.
WINUSERAPI
BOOL
WINAPI
ThemePrimitiveExists(
      THEMEPRIMITIVETYPE tpt
      );

 

由于没有提供相应的lib,需要GetProcAddress来得到函数地址

 

  1. typedef void (* PUpdateThemePrimitives)(void); 
  2. typedef BOOL (* PDrawThemePrimitive)(THEMEPRIMITIVETYPE tpt, HDC hdc, LPRECT prc); 
  3. typedef BOOL (* PThemePrimitiveExists)(THEMEPRIMITIVETYPE tpt); 
  4.  
  5. PUpdateThemePrimitives fnUpdateThemePrimitives = NULL; 
  6. PDrawThemePrimitive fnDrawThemePrimitive = NULL; 
  7. PThemePrimitiveExists fnThemePrimitiveExists = NULL; 
  8.  
  9. // Updates all the theme primitives 
  10. WINUSERAPI 
  11. void 
  12. WINAPI 
  13. UpdateThemePrimitives( 
  14.        void 
  15.        ) 
  16.  if(!fnUpdateThemePrimitives) 
  17.  { 
  18.   HINSTANCE hDll = LoadLibrary(L"coredll.dll"); 
  19.   fnUpdateThemePrimitives = 
  20. (PUpdateThemePrimitives)GetProcAddress(hDll, MAKEINTRESOURCE(2720)); 
  21.   FreeLibrary(hDll); 
  22.  } 
  23.   
  24.  if(fnUpdateThemePrimitives) 
  25.   fnUpdateThemePrimitives(); 
  26.  
  27. // Draw a theme primitive (specified by its index) into a specified RECT area of a DC 
  28. // Note: if the DC passed in is NULL, this method fills bitmap rect info to  prc, then 
  29. // return TRUE. 
  30. WINUSERAPI 
  31. BOOL 
  32. WINAPI 
  33. DrawThemePrimitive( 
  34.        THEMEPRIMITIVETYPE tpt, 
  35.        HDC hdc, 
  36.        LPRECT prc 
  37.        ) 
  38.  if(!fnDrawThemePrimitive) 
  39.  { 
  40.   HINSTANCE hDll = LoadLibrary(L"coredll.dll"); 
  41.   fnDrawThemePrimitive = (PDrawThemePrimitive)GetProcAddress(hDll, MAKEINTRESOURCE(2718)); 
  42.   FreeLibrary(hDll); 
  43.  } 
  44.  if(fnDrawThemePrimitive) 
  45.   return fnDrawThemePrimitive(tpt, hdc, prc); 
  46.  return FALSE; 
  47.  
  48. // Returns TRUE if the theme primitive (specified by its index) exists and is enabled. 
  49. // A theme primitive exists if it has a non-zero HDC. Theme primitives are disabled if 
  50. // layered windows are disabled. 
  51. WINUSERAPI 
  52. BOOL 
  53. WINAPI 
  54. ThemePrimitiveExists( 
  55.       THEMEPRIMITIVETYPE tpt 
  56.       ) 
  57.  if(!fnThemePrimitiveExists) 
  58.  { 
  59.   HINSTANCE hDll = LoadLibrary(L"coredll.dll"); 
  60.   fnThemePrimitiveExists = 
  61. (PThemePrimitiveExists)GetProcAddress(hDll, MAKEINTRESOURCE(2718)); 
  62.   FreeLibrary(hDll); 
  63.  } 
  64.  if(fnThemePrimitiveExists) 
  65.   return fnThemePrimitiveExists(tpt); 
  66.  return FALSE; 

 

(jinhaijian)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201007/9872.html]
本文出处:CSDN博客 作者:jinhaijian
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容