﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Welcome to ErranLi's Blog!-随笔分类-WinCE</title><link>http://www.cppblog.com/erran/category/5346.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 20:29:22 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 20:29:22 GMT</pubDate><ttl>60</ttl><item><title>转：浅谈wince应用程序的可移植性</title><link>http://www.cppblog.com/erran/archive/2007/10/13/34130.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 13 Oct 2007 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2007/10/13/34130.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/34130.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2007/10/13/34130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/34130.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/34130.html</trackback:ping><description><![CDATA[
		<p style="font-size: 10pt; font-family: Arial;">原文：<a href="/milkyway/archive/2007/04/08/21481.html">http://www.cppblog.com/milkyway/archive/2007/04/08/21481.html</a><br />作者：<a id="viewpost1_TitleUrl" href="/milkyway/archive/2007/04/08/21481.html"><font color="#2e9ce9" size="3"><br /><br /><br />浅谈wince应用程序的可移植性</font></a></p>
		<p style="font-size: 10pt; font-family: Arial;">      由于windows绝大多数情况下运行于X86平台上，也就不存在不同平台的可移植性问题。然而Windows CE运行在四大架构（X86，SHx，MIPS，ARM）的CPU上，编写应用程序时就需要考虑它的移植。<br />       以下通过在wince系统下访问物理地址，来看看如何编写可移植性较好的应用程序。<br />       首先必须明确两个概念。<br />       1。在X86平台下才有I/O地址这一说，在其他体系的CPU（如ARM/MIPS）下是没有I/O端口的。因为X86下把I/O和存储器分开编址，导致其有两种地址；而别的CPU是把两者统一编址，即把I/O映射到存储器上。<br />        2。wince的存储管理是通过MMU实现的，在系统启动后，我们只能访问虚拟存储空间，必须经过MMU。但是在X86下，访问I/O口和存储器走的地址总线不同，不用经过MMU。<br />         比如我们想要访问挂在某总线上物理地址为360h的端口，对于X86平台我们可以直接嵌入汇编操作物理地址， 或者使用地址指针访问物理地址。但对于其他平台，我们必须先作一个物理地址到虚拟地址的映射，然后操作其虚拟地址。这样显然程序的可移植性不好，我们需要定义  #ifdef __x86....#elif defined __arm  使得在不同平台下程序能够顺利运行。<br />          如果使用下面的代码我们就可以不用这么费劲的定义不同平台了：<br />        先定义<br />     inIoSpace = 1;<br />    ioPhysicalBase.QuadPart = 0x360;</p>
		<p style="font-size: 10pt; font-family: Arial;">if( HalTranslateBusAddress( Isa,                 //此函数把ISA总线上物理地址映射为系统物理地址<br />                            0,<br />                            ioPhysicalBase,<br />                            &amp;inIoSpace,                  //此参数=1说明转化的是I/O空间地址，=0时存储器地址<br />                            &amp;ioPhysicalBase ) )<br />{<br />    if( !inIoSpace )                                           ////如果是存储器地址，针对非X86 平台<br /><br />    {<br />            ioPortBase = ( PUCHAR ) MmMapIoSpace(            //此函数把系统物理地址转化为虚拟地址<br />            ioPhysicalBase,<br />            IoLen,<br />            FALSE );<br />        if( ioPortBase == NULL )<br />        {<br />            //TODO: Error handling<br />        }<br />    }<br />    else                                                 //如果是I/O，即X86 下，不需要做地址映射<br />    {<br />        ioPortBase = ( PUCHAR ) ioPhysicalBase.LowPart;<br />    }<br />}<br />else<br />{<br />    //TODO: Error Handling<br />}</p>
		<p style="font-size: 10pt; font-family: Arial;">       随后对于端口的操作（ ioPortBase），我们也可以充分挖掘它的可移植性。通过使用READ_PORT_UCHAR, <br />WRITE_PORT_UCHAR这些wince下的宏来实现端口读写。而不是在X86下用指针操作（不仅移植性差，而且容易产生问题）。CE下的宏在内部是封装好的API函数。例如WRITE_PORT_UCHAR这个宏在X86 处理器上转化为一条OUT的汇编指令；而在ARM处理器上会转化成一条对虚拟地址的写指令。 </p>
<img src ="http://www.cppblog.com/erran/aggbug/34130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2007-10-13 17:58 <a href="http://www.cppblog.com/erran/archive/2007/10/13/34130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：MultiByteToWideChar和WideCharToMultiByte用法详解</title><link>http://www.cppblog.com/erran/archive/2007/10/13/34129.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 13 Oct 2007 09:55:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2007/10/13/34129.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/34129.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2007/10/13/34129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/34129.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/34129.html</trackback:ping><description><![CDATA[
		<p>
				<span id="ContentBody" style="font-size: 10pt; font-family: Arial;">
				</span>
		</p>
		<p>在进行ce的开发时，经常设计到字符的转换，特别是系统中包含网络通讯时，更是如此。ce中均是Unicode编码，而网络通讯一般都使用BYTE进行数据传输。</p>
		<p>以下是在网上找到的一篇文章，介绍的很详细。</p>
		<p> 1.使用方法详解<br /><br />  在本文开始之处,先简要地说一下何为短字符和宽字符.<br />  所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.<br />  <br />  宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.<br />  好吧,那就让我们开始吧.<br />  <br />  这个是我们需要转化的多字节字符串:  <br />  char sText[20] = {"多字节字符串!OK!"};<br />  <br />  我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.<br />  所幸,我们能够确知所需要的数组空间.<br />  我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:<br />  DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);<br />  <br />  接下来,我们只需要分配响应的数组空间:<br />  wchar_t *pwText;<br />  pwText = new wchar_t[dwNum];<br />  if(!pwText)<br />  {<br />   delete []pwText;<br />  }<br />  <br />  接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:<br />  MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize);<br />  <br />  最后,使用完毕当然要记得释放占用的内存:<br />  delete []psText;<br />  <br /> <br />  同理,宽字符转为多字节字符的代码如下:  <br />  wchar_t wText[20] = {L"宽字符转换实例!OK!"};<br />  DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);<br />  char *psText;<br />  psText = new char[dwNum];<br />  if(!psText)<br />  {<br />   delete []psText;<br />  }<br />  WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);<br />  delete []psText;<br />  <br />   如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?<br />   WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:<br />     <br />  //-------------------------------------------------------------------------------------<br />  //Description:<br />  // This function maps a character string to a wide-character (Unicode) string<br />  //<br />  //Parameters:<br />  // lpcszStr: [in] Pointer to the character string to be converted <br />  // lpwszStr: [out] Pointer to a buffer that receives the translated string. <br />  // dwSize: [in] Size of the buffer<br />  //<br />  //Return Values:<br />  // TRUE: Succeed<br />  // FALSE: Failed<br />  // <br />  //Example:<br />  // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));<br />  //---------------------------------------------------------------------------------------<br />  BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)<br />  {<br />    // Get the required size of the buffer that receives the Unicode <br />    // string. <br />    DWORD dwMinSize;<br />    dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);<br />  <br />    if(dwSize &lt; dwMinSize)<br />    {<br />     return FALSE;<br />    }<br />  <br />    <br />    // Convert headers from ASCII to Unicode.<br />    MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  <br />    return TRUE;<br />  }<br />  <br />  //-------------------------------------------------------------------------------------<br />  //Description:<br />  // This function maps a wide-character string to a new character string<br />  //<br />  //Parameters:<br />  // lpcwszStr: [in] Pointer to the character string to be converted <br />  // lpszStr: [out] Pointer to a buffer that receives the translated string. <br />  // dwSize: [in] Size of the buffer<br />  //<br />  //Return Values:<br />  // TRUE: Succeed<br />  // FALSE: Failed<br />  // <br />  //Example:<br />  // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));<br />  //---------------------------------------------------------------------------------------<br />  BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)<br />  {<br />   DWORD dwMinSize;<br />   dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);<br />   if(dwSize &lt; dwMinSize)<br />   {<br />    return FALSE;<br />   }<br />   WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);<br />   return TRUE;<br />  }<br />  <br />  <br />  使用方法也很简单,示例如下:<br />  wchar_t wText[10] = {L"函数示例"};<br />  char sText[20]= {0};<br />  WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));<br />  MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));<br />  <br />  这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.<br /><br />  <br />2.MultiByteToWideChar()函数乱码的问题<br /><br />  有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.<br />  不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".<br />  系统定制时选择默认语言的位置于:<br />  Platform -&gt; Setting... -&gt; locale -&gt; default language ,选择"中文",然后编译即可.<br /></p>
<img src ="http://www.cppblog.com/erran/aggbug/34129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2007-10-13 17:55 <a href="http://www.cppblog.com/erran/archive/2007/10/13/34129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EVC下实现WinCE软件换肤之CDialogSk</title><link>http://www.cppblog.com/erran/archive/2006/12/26/16889.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Tue, 26 Dec 2006 13:49:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2006/12/26/16889.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/16889.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2006/12/26/16889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/16889.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/16889.html</trackback:ping><description><![CDATA[<p><font face=Arial size=2>这里实现了对话筐的换肤，测试效果还可以。</font> </p>
<p><br><font face=Arial size=2>///////////////////////////////////////////////////<br>//<br>//&nbsp; CDialogSK : dialog skin <br>//<br>//&nbsp; writer: erran<br>// <br>//&nbsp; time: 2006-03-24<br>//<br>///////////////////////////////////////////////////</font> </p>
<p><font face=Arial size=2>＃i nclude "BaseSK.h"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///</font> <a href="http://www.cppblog.com/erran/archive/2006/12/26/16887.html"><font face=Arial size=2>EVC下实现WinCE软件换肤之函数TransparentBitBlt</font> </a><br><font face=Arial size=2>＃i nclude "BitmapSK.h"&nbsp;&nbsp; ///</font> <a href="http://www.cppblog.com/erran/archive/2006/12/26/16888.html"><font face=Arial size=2>EVC下实现WinCE软件换肤之换肤基础类CBitmapSK</font> </a><font face=Arial size=2>　</font> </p>
<p><font face=Arial size=2>class CDialogSK: public CDialog<br>{</font> </p>
<p><font face=Arial size=2>public:<br>&nbsp;// constructor and Destructor<br>&nbsp;CDialogSK();<br>&nbsp;CDialogSK(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);<br>&nbsp;CDialogSK(UINT nIDTemplate, CWnd* pParentWnd = NULL); <br>&nbsp;~CDialogSK();</font> </p>
<p><font face=Arial size=2>protected:<br>&nbsp;// common constructor <br>&nbsp;Constructor();&nbsp;<br>&nbsp;// Destructor,Release the bitmap<br>&nbsp;Destructor();</font> </p>
<p><font face=Arial size=2>protected:<br>&nbsp;//window title text<br>&nbsp;CString m_titleText;</font> </p>
<p><font face=Arial size=2>protected:<br>&nbsp;//interface bitmap <br>&nbsp;CBitmapSK m_bmpLeft;&nbsp; //dialog border left bitmap<br>&nbsp;CBitmapSK m_bmpRight; //dialog border right bitmap<br>&nbsp;CBitmapSK m_bmpBottom;//dialog border bottom bitmap<br>&nbsp;CBitmapSK m_bmpTitle;&nbsp;&nbsp; //two bitmap, dlg active and disactive<br>&nbsp;CBitmapSK m_bmpTitleBtn;//max min close btn bitmap<br>&nbsp;CBitmapSK m_bmpBkDlg; //dialog back ground bitmap<br>protected:<br>&nbsp;//transparent color of bitmap<br>&nbsp;COLORREF m_transColorLeft;<br>&nbsp;COLORREF m_transColorRight;<br>&nbsp;COLORREF m_transColorBottom;<br>&nbsp;COLORREF m_transColorTitle;<br>&nbsp;COLORREF m_transColorTitleBtn;<br>&nbsp;COLORREF m_transColorBackDlg;</font> </p>
<p><font face=Arial size=2>protected:</font> </p>
<p><font face=Arial size=2>&nbsp;//window border width and height <br>&nbsp;// the border can not more than the border bmp size <br>&nbsp;int m_borderLeftWidth;<br>&nbsp;int m_borderRightWidth;<br>&nbsp;int m_borderBottomHeight;<br>&nbsp;int m_titleHeight;<br>&nbsp;//offset in the bitmap<br>&nbsp;int m_offsetLeft1, m_offsetLeft2;<br>&nbsp;int m_offsetRight1, m_offsetRight2;<br>&nbsp;int m_offsetBottom1, m_offsetBottom2;<br>&nbsp;int m_offsetTitle1, m_offsetTitle2;</font> </p>
<p><font face=Arial size=2>public:<br>&nbsp;//window style<br>&nbsp;BOOL m_titlable;<br>&nbsp;BOOL m_sizable;<br>&nbsp;BOOL m_minable;<br>&nbsp;BOOL m_maxable;<br>&nbsp;BOOL m_sysmenu;</font> </p>
<p><font face=Arial size=2>&nbsp;BOOL m_isActive;</font> </p>
<p><font face=Arial size=2>public:<br>&nbsp;BOOL m_winTransable;</font> </p>
<p><font face=Arial size=2>public:<br>&nbsp;//msg<br>&nbsp;void OnPaint();<br>&nbsp;BOOL OnEraseBkgnd(CDC* pDC);</font> </p>
<p><font face=Arial size=2>public:<br>&nbsp;// draw skin (x,y) is this dialog region<br>&nbsp;BOOL DrawRight(CDC *pDC, int x, int y, int height, int state);<br>&nbsp;BOOL DrawLeft(CDC *pDC, int x, int y, int height, int state);<br>&nbsp;BOOL DrawBottom(CDC *pDC, int x, int y, int width, int state);<br>&nbsp;BOOL DrawTitle(CDC *pDC, int x, int y, int width, int state);</font> </p>
<p><font face=Arial size=2>&nbsp;BOOL DrawFrame(CDC *pDC, int x, int y,int width, int height, int state);<br>&nbsp;BOOL DrawBkDlg(CDC *pDC, int x, int y,int width, int height, int state);&nbsp;<br>&nbsp;<br>&nbsp;BOOL DrawButton( CDC * pDC, int i, int state );</font> </p>
<p><font face=Arial size=2>};</font> </p>
<p><font face=Arial size=2></font>&nbsp;</p>
<p><font face=Arial size=2>＃i nclude "stdafx.h"<br>＃i nclude "DialogSK.h"</font> </p>
<p><font face=Arial size=2>/////////////////////////////////////////////////////////////////////////////<br>// CDialogSK dialog</font> </p>
<p><br><font face=Arial size=2>CDialogSK::CDialogSK()<br>:CDialog() <br>{<br>}</font> </p>
<p><font face=Arial size=2>CDialogSK::CDialogSK(LPCTSTR lpszTemplateName, CWnd* pParentWnd/*= NULL*/)<br>:CDialog(lpszTemplateName, pParentWnd)<br>{<br>}</font> </p>
<p><font face=Arial size=2>CDialogSK::CDialogSK(UINT nIDTemplate, CWnd* pParentWnd/*/= NULL*/)<br>:CDialog(nIDTemplate, pParentWnd)<br>{<br>&nbsp;<br>}</font> </p>
<p><font face=Arial size=2>CDialogSK::~CDialogSK()<br>{<br>}</font> </p>
<p><font face=Arial size=2>CDialogSK::Constructor()<br>{<br>&nbsp;&nbsp; /*测试用<br>&nbsp;m_bmpLeft.LoadBitmapEx(NULL, IDB_LEFT);&nbsp; <br>&nbsp;m_bmpRight.LoadBitmapEx(NULL, IDB_RIGHT);<br>&nbsp;m_bmpBottom.LoadBitmapEx(NULL, IDB_BOTTOM);<br>&nbsp;m_bmpTitle.LoadBitmapEx(NULL, IDB_TOP);&nbsp; <br>&nbsp;&nbsp;<br>&nbsp;m_titleHeight = m_bmpTitle.Height()/2;<br>&nbsp;m_borderLeftWidth = m_bmpLeft.Width()/2;<br>&nbsp;m_borderRightWidth = m_bmpRight.Width()/2;<br>&nbsp;m_borderBottomHeight = m_bmpBottom.Height()/2;</font> </p>
<p><font face=Arial size=2>&nbsp;m_offsetLeft1 = 10;<br>&nbsp;m_offsetLeft2 = 10;<br>&nbsp;m_offsetRight1 = 10;<br>&nbsp;m_offsetRight2 = 10;<br>&nbsp;m_offsetBottom1 = 10;<br>&nbsp;m_offsetBottom2 = 10;<br>&nbsp;m_offsetTitle1 = 10;<br>&nbsp;m_offsetTitle2 = 10;<br>&nbsp;&nbsp; */</font> </p>
<p><font face=Arial size=2>}</font> </p>
<p><font face=Arial size=2>CDialogSK::Destructor()<br>{<br>}</font> </p>
<p><br><font face=Arial size=2>BOOL CDialogSK::DrawRight(CDC *pDC, int x, int y, int height, int state)<br>{&nbsp;<br>&nbsp;int bmpwidth, bmpheight;<br>&nbsp;m_bmpRight.Size(bmpwidth, bmpheight);</font> </p>
<p><font face=Arial size=2>&nbsp;//bitmap rect<br>&nbsp;RECT srctop, srcmid, desmid, srcdown;</font> </p>
<p><font face=Arial size=2>&nbsp;if (state == 0)<br>&nbsp;{<br>&nbsp;&nbsp;srctop = CRect(0, 0, m_borderRightWidth, m_offsetRight1);<br>&nbsp;&nbsp;srcmid = CRect(0, m_offsetRight1, m_borderRightWidth, m_offsetRight2);<br>&nbsp;&nbsp;srcdown = CRect(0, m_offsetRight2, m_borderRightWidth, bmpheight);<br>&nbsp;}<br>&nbsp;else <br>&nbsp;{<br>&nbsp;&nbsp;srctop = CRect(m_borderRightWidth, 0, bmpwidth, m_offsetRight1);<br>&nbsp;&nbsp;srcmid = CRect(m_borderRightWidth, m_offsetRight1, bmpwidth, m_offsetRight2);<br>&nbsp;&nbsp;srcdown = CRect(m_borderRightWidth, m_offsetRight2, bmpwidth, bmpheight);<br>&nbsp;}</font> </p>
<p><font face=Arial size=2>&nbsp;desmid = CRect(x, y+m_offsetRight1, x+m_borderRightWidth, y+height-bmpheight+m_offsetRight2);</font> </p>
<p><font face=Arial size=2>&nbsp;m_bmpRight.Draw(pDC, x, y, &amp;srctop);<br>&nbsp;m_bmpRight.Fill(pDC, &amp;desmid, &amp;srcmid);<br>&nbsp;m_bmpRight.Draw(pDC, x, y+height-bmpheight+m_offsetRight2, &amp;srcdown);</font> </p>
<p><font face=Arial size=2>&nbsp;return TRUE;<br>}</font> </p>
<p><font face=Arial size=2>BOOL CDialogSK::DrawLeft(CDC *pDC, int x, int y, int height, int state)<br>{&nbsp;<br>&nbsp;int bmpwidth, bmpheight;<br>&nbsp;m_bmpLeft.Size(bmpwidth, bmpheight);</font> </p>
<p><font face=Arial size=2>&nbsp;//bitmap rect<br>&nbsp;RECT srctop, srcmid, desmid, srcdown;</font> </p>
<p><font face=Arial size=2>&nbsp;if (state == 0)<br>&nbsp;{<br>&nbsp;&nbsp;srctop = CRect(0, 0, m_borderLeftWidth, m_offsetLeft1);<br>&nbsp;&nbsp;srcmid = CRect(0, m_offsetLeft1, m_borderLeftWidth, m_offsetLeft2);<br>&nbsp;&nbsp;srcdown = CRect(0, m_offsetLeft2, m_borderLeftWidth, bmpheight);<br>&nbsp;}<br>&nbsp;else <br>&nbsp;{<br>&nbsp;&nbsp;srctop = CRect(m_borderLeftWidth, 0, bmpwidth, m_offsetRight1);<br>&nbsp;&nbsp;srcmid = CRect(m_borderLeftWidth, m_offsetLeft1, bmpwidth, m_offsetLeft2);<br>&nbsp;&nbsp;srcdown = CRect(m_borderLeftWidth, m_offsetLeft2, bmpwidth, bmpheight);<br>&nbsp;}</font> </p>
<p><font face=Arial size=2>&nbsp;desmid = CRect(x, y+m_offsetLeft1, x+m_borderLeftWidth, y+height-bmpheight+m_offsetLeft2);</font> </p>
<p><font face=Arial size=2>&nbsp;m_bmpLeft.Draw(pDC, x, y, &amp;srctop);<br>&nbsp;m_bmpLeft.Fill(pDC, &amp;desmid, &amp;srcmid);<br>&nbsp;m_bmpLeft.Draw(pDC, x, y+height-bmpheight+m_offsetLeft2, &amp;srcdown);</font> </p>
<p><font face=Arial size=2>&nbsp;return TRUE;<br>}</font> </p>
<p><font face=Arial size=2>BOOL CDialogSK::DrawBottom(CDC *pDC, int x, int y, int width, int state)<br>{<br>&nbsp;int bmpwidth, bmpheight;<br>&nbsp;m_bmpBottom.Size(bmpwidth, bmpheight);</font> </p>
<p><font face=Arial size=2>&nbsp;RECT srcleft, srcmid, desmid, srcright;</font> </p>
<p><font face=Arial size=2>&nbsp;if (state == 0)<br>&nbsp;{<br>&nbsp;&nbsp;srcleft = CRect(0, 0, m_offsetBottom1, m_borderBottomHeight);<br>&nbsp;&nbsp;srcmid = CRect(m_offsetBottom1, 0, m_offsetBottom2, m_borderBottomHeight);<br>&nbsp;&nbsp;srcright = CRect(m_offsetBottom2, 0, bmpwidth, m_borderBottomHeight);<br>&nbsp;}<br>&nbsp;else <br>&nbsp;{<br>&nbsp;&nbsp;srcleft = CRect(0, m_borderBottomHeight, m_offsetBottom1, bmpheight);<br>&nbsp;&nbsp;srcmid = CRect(m_offsetBottom1, m_borderBottomHeight, m_offsetBottom2, bmpheight);<br>&nbsp;&nbsp;srcright = CRect(m_offsetBottom2, m_borderBottomHeight, bmpwidth, bmpheight);<br>&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;desmid = CRect(x+m_offsetBottom1, y, x+width-bmpwidth+m_offsetBottom2, y+m_borderBottomHeight);</font> </p>
<p><font face=Arial size=2>&nbsp;m_bmpBottom.Draw(pDC, x, y, &amp;srcleft);<br>&nbsp;m_bmpBottom.Fill(pDC, &amp;desmid, &amp;srcmid);<br>&nbsp;m_bmpBottom.Draw(pDC, x+width-bmpwidth+m_offsetBottom2, y, &amp;srcright);</font> </p>
<p><font face=Arial size=2>&nbsp;return TRUE;<br>}</font> </p>
<p><font face=Arial size=2>BOOL CDialogSK::DrawTitle(CDC *pDC, int x, int y, int width, int state)<br>{&nbsp;<br>&nbsp;int bmpwidth, bmpheight;<br>&nbsp;m_bmpTitle.Size(bmpwidth, bmpheight);</font> </p>
<p><font face=Arial size=2>&nbsp;RECT srcleft, srcmid, desmid, srcright;</font> </p>
<p><font face=Arial size=2>&nbsp;if (state == 0)<br>&nbsp;{<br>&nbsp;&nbsp;srcleft = CRect(0, 0, m_offsetTitle1, m_titleHeight);<br>&nbsp;&nbsp;srcmid = CRect(m_offsetTitle1, 0, m_offsetTitle2, m_titleHeight);<br>&nbsp;&nbsp;srcright = CRect(m_offsetTitle2, 0, bmpwidth, m_titleHeight);<br>&nbsp;}<br>&nbsp;else <br>&nbsp;{<br>&nbsp;&nbsp;srcleft = CRect(0, m_titleHeight, m_offsetTitle1, bmpheight);<br>&nbsp;&nbsp;srcmid = CRect(m_offsetTitle1, m_titleHeight, m_offsetTitle2, bmpheight);<br>&nbsp;&nbsp;srcright = CRect(m_offsetTitle2, m_titleHeight, bmpwidth, bmpheight);<br>&nbsp;}</font> </p>
<p><font face=Arial size=2>&nbsp;desmid = CRect(x+m_offsetTitle1, y, x+width-bmpwidth+m_offsetTitle2, y+m_titleHeight);</font> </p>
<p><font face=Arial size=2>&nbsp;m_bmpTitle.Draw(pDC, x, y, &amp;srcleft);<br>&nbsp;m_bmpTitle.Fill(pDC, &amp;desmid, &amp;srcmid);<br>&nbsp;m_bmpTitle.Draw(pDC, x+width-bmpwidth+m_offsetTitle2, y, &amp;srcright);</font> </p>
<p><font face=Arial size=2>&nbsp;return TRUE;<br>}</font> </p>
<p><font face=Arial size=2>BOOL CDialogSK::DrawFrame(CDC *pDC, int x, int y,int width, int height, int state)<br>{<br>&nbsp;DrawTitle(pDC, x+m_borderLeftWidth, y, width-m_borderLeftWidth-m_borderRightWidth, state);&nbsp;<br>&nbsp;DrawLeft(pDC, x, y, height, state);<br>&nbsp;DrawRight(pDC, x+width-m_borderRightWidth, y, height, state);<br>&nbsp;DrawBottom(pDC, x+m_borderLeftWidth, y+height-m_borderBottomHeight, width-m_borderLeftWidth-m_borderRightWidth, state);&nbsp;<br>&nbsp;<br>&nbsp;return TRUE;<br>}</font> </p>
<p><font face=Arial size=2>BOOL CDialogSK::DrawBkDlg(CDC *pDC, int x, int y,int width, int height, int state)<br>{<br>&nbsp;int bmpwidth, bmpheight;<br>&nbsp;m_bmpBkDlg.Size(bmpwidth, bmpheight);<br>&nbsp;&nbsp;<br>&nbsp;RECT des, src;<br>&nbsp;des = CRect(x,y, x+width, y+height);<br>&nbsp;src = CRect(0, 0, bmpwidth, bmpheight);</font> </p>
<p><font face=Arial size=2>&nbsp;m_bmpBkDlg.Fill(pDC, &amp;des, &amp;src);</font> </p>
<p><font face=Arial size=2>&nbsp;return TRUE;<br>}</font> </p>
<p><font face=Arial size=2>BOOL CDialogSK::OnEraseBkgnd(CDC* pDC)<br>{&nbsp;<br>&nbsp;CRect rtClient = CClientRect(m_hWnd);<br>&nbsp;&nbsp;<br>&nbsp;DrawFrame(pDC, rtClient.left, rtClient.top, rtClient.Width(), rtClient.Height(),0);<br>&nbsp;DrawBkDlg(pDC, rtClient.left+m_borderLeftWidth, rtClient.top+m_titleHeight,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtClient.Width()-m_borderLeftWidth-m_borderRightWidth, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtClient.Height()-m_titleHeight-m_borderBottomHeight,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);</font> </p>
<p><br><font face=Arial size=2>&nbsp;return TRUE;<br><br>}</font> </p>
<p><font face=Arial size=2>呵呵，就这么多了，这里不方便贴图，要不可以看到效果的，呵呵，欢迎指教。</font> </p>
<img src ="http://www.cppblog.com/erran/aggbug/16889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2006-12-26 21:49 <a href="http://www.cppblog.com/erran/archive/2006/12/26/16889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EVC下实现WinCE软件换肤之换肤基础类CBitmapSK</title><link>http://www.cppblog.com/erran/archive/2006/12/26/16888.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Tue, 26 Dec 2006 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2006/12/26/16888.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/16888.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2006/12/26/16888.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/16888.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/16888.html</trackback:ping><description><![CDATA[<p style="MARGIN: 13pt 0cm"><font face=Arial size=2><span style="FONT-FAMILY: 宋体"><span lang=EN-US><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 24.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-weight: bold; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">由于在wince下不支持hook，所以对ce下的软件换肤，会很慧心，不过，曾经看到过一个国外的网站上有pocket下实现hook的代码，没读懂，呵呵，自己太水了,这就涉及到另外一个问题了，还没有找到实现hook的方法，所有要另外想办法了，所以不管怎么样都要重写控件，参考了一些VC实现的换肤，在此实现了基本类CBitmapSK。其中有个郁闷的地方是evc对CRgn支持的不全面，对任意形状的窗口实现有些麻烦，所以有个重要的函数不能实现，要想其他的办法实现，<br></span></span></span></font><font size=2><span style="FONT-FAMILY: 宋体"><span lang=EN-US><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 24.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-weight: bold; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font face=Arial>//////////////////////////////////////////////////////////////////////<br>//<br>// BaseSK.h: interface for the CBitmapSK class.<br>//<br>// writer : erran<br>//<br>// time:&nbsp; 2006-03-10<br>//<br>//////////////////////////////////////////////////////////////////////<br></font></span></span></span></font><font size=2><span style="FONT-FAMILY: 宋体"><span lang=EN-US><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 24.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-weight: bold; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br><font face=Arial>class CBitmapSK : public CBitmap&nbsp; <br>{<br>public:<br>&nbsp;<br>&nbsp;CBitmapSK();<br>&nbsp;virtual ~CBitmapSK();</font> </span></span></span></font></p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//load bitmap by resource file path<br>&nbsp;BOOL LoadBitmapEx(LPCTSTR lpszFileName);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//load bitmap by resource name or ID<br>&nbsp;BOOL LoadBitmapEx(LPCTSTR lpszResourceName, UINT nIDResource);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//attaches a hBitmap to a CBitmap object.<br>&nbsp;BOOL Attach(HBITMAP hbmp)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; return CBitmap::Attach(hbmp);<br>&nbsp;}<br>&nbsp;<br>&nbsp;void Size(int &amp;width, int &amp;height)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp; BITMAP bm;<br>&nbsp;&nbsp;&nbsp; memset(&amp;bm, 0, sizeof(bm));<br>&nbsp;&nbsp;&nbsp; CBitmap::GetBitmap(&amp;bm);<br>&nbsp;&nbsp;&nbsp; width = bm.bmWidth;<br>&nbsp;&nbsp;&nbsp; height = bm.bmHeight;<br>&nbsp;}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//bitmap width<br>&nbsp;int Width(void)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp; BITMAP bm;<br>&nbsp;&nbsp;&nbsp; memset(&amp;bm, 0, sizeof(bm));<br>&nbsp;&nbsp;&nbsp; CBitmap::GetBitmap(&amp;bm);<br>&nbsp;&nbsp;&nbsp; return bm.bmWidth;<br>&nbsp;}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//bitmap height<br>&nbsp;int Height()<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp; BITMAP bm;<br>&nbsp;&nbsp;&nbsp; memset(&amp;bm, 0, sizeof(bm));<br>&nbsp;&nbsp;&nbsp; CBitmap::GetBitmap(&amp;bm);<br>&nbsp;&nbsp;&nbsp; return bm.bmHeight;<br>&nbsp;}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;/////// src(bmp) ---&gt; Des(pDC)</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//draw current bitmap to device(pDC rect(lpr))&nbsp; <br>&nbsp;BOOL Draw(CDC *pDC, LPRECT lprDes);<br>&nbsp;//draw current bitmap to device(pDC rect(lpr)) , transparent&nbsp; <br>&nbsp;BOOL Draw(CDC *pDC, LPRECT lprDes, COLORREF crTrans, BOOL isTrans);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//draw sub bitmap(the rect lprSrc of current bitmap) to special point( the begin point (x,y) of pDC device)<br>&nbsp;BOOL Draw(CDC *pDC, int x, int y, LPRECT lprSrc);<br>&nbsp;//draw sub bitmap to special point<br>&nbsp;BOOL Draw(CDC *pDC, int x, int y, LPRECT lprSrc, COLORREF crTrans, BOOL isTrans);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;BOOL Fill(CDC *pDC, LPRECT lprDes);<br>&nbsp;BOOL Fill(CDC *pDC, LPRECT lprDes, COLORREF crTrans, BOOL isTrans);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;BOOL Fill(CDC *pDC, LPRECT lprDes, LPRECT lprSrc);&nbsp;<br>&nbsp;BOOL Fill(CDC *pDC, LPRECT lprDes, LPRECT lprSrc, COLORREF crTrans, BOOL isTrans);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//Drawing Transparent Bitmaps,Copies a bitmap transparently onto the destination DC<br>&nbsp;BOOL TransparentDraw(CDC * pDC, int x, int y, COLORREF crColour);<br>&nbsp;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//Copies a bitmap from a source rectangle into a destination rectangle, <br>&nbsp;//stretching or compressing the bitmap if necessary to fit the dimensions of the destination rectangle.<br>&nbsp;BOOL StretchDraw(CDC *pDC, LPRECT lprDes, LPRECT lprSrc);<br>&nbsp;//Copies a bitmap from a source rectangle into a destination rectangle, <br>&nbsp;//stretching or compressing the bitmap if necessary to fit the dimensions of the destination rectangle.&nbsp;<br>&nbsp;BOOL StretchDraw(CDC *pDC, LPRECT lprSrc);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//make a region from bitmap, It will show as a window&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::: faulse function :::<br>&nbsp;//HRGN CreateRegion(COLORREF crColour, BOOL isTrans = TRUE);&nbsp;&nbsp;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>};</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial size=2><span style="FONT-FAMILY: 宋体"><span lang=EN-US><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 24.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-weight: bold; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></span></span></span></font>&nbsp;</p>
<font size=2><span style="FONT-FAMILY: 宋体"><span lang=EN-US><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 24.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-weight: bold; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
<p style="MARGIN: 13pt 0cm"><br><font face=Arial>////for class CBitmapSK</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>CBitmapSK::CBitmapSK()<br>{<br>&nbsp;<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>CBitmapSK::~CBitmapSK()<br>{<br>&nbsp;<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>BOOL CBitmapSK::LoadBitmapEx(LPCTSTR lpszFileName)<br>{<br>&nbsp;&nbsp; DeleteObject();</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; ASSERT(m_hObject==NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; HBITMAP hBitmap = NULL;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp;&nbsp;hBitmap = (HBITMAP)::LoadImage(0, lpszFileName, IMAGE_BITMAP, 0, 0, 0);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; if(hBitmap == NULL) return FALSE;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp;&nbsp;return CBitmap::Attach(hBitmap);<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>BOOL CBitmapSK::LoadBitmapEx(LPCTSTR lpszResourceName, UINT nIDResource)<br>{<br>&nbsp;&nbsp; DeleteObject();</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; ASSERT(m_hObject==NULL);<br>&nbsp;<br>&nbsp;&nbsp; if (lpszResourceName != NULL)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return CBitmap::LoadBitmap(lpszResourceName);<br>&nbsp; }</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp;if (nIDResource != 0)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;return CBitmap::LoadBitmap(nIDResource);<br>&nbsp; }<br>&nbsp;<br>&nbsp; return FALSE;<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>BOOL CBitmapSK::Draw(CDC *pDC, LPRECT lprDes)<br>{<br>&nbsp; ASSERT(pDC!=NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; CDC dc;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; dc.CreateCompatibleDC(pDC);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; CBitmap *bmp = dc.SelectObject(this);&nbsp;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; pDC-&gt;BitBlt(lprDes-&gt;left, lprDes-&gt;top, <br>&nbsp;&nbsp;&nbsp;&nbsp;lprDes-&gt;right - lprDes-&gt;left, lprDes-&gt;bottom - lprDes-&gt;top,<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;dc, 0, 0, SRCCOPY);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; dc.SelectObject(bmp);&nbsp;&nbsp;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; dc.DeleteDC();<br>&nbsp;&nbsp;bmp = NULL;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; return TRUE;<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>BOOL CBitmapSK::Draw(CDC *pDC, LPRECT lprDes, COLORREF crTrans, BOOL isTrans)<br>{<br>&nbsp; ASSERT(pDC!=NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp;if (!isTrans)<br>&nbsp; {<br>&nbsp;&nbsp; &nbsp;return Draw(pDC, lprDes);<br>&nbsp; }<br>&nbsp; else <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return TransparentBitBlt(pDC-&gt;GetSafeHdc(), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lprDes-&gt;left,lprDes-&gt;top,Width(),Height(),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (HBITMAP)this-&gt;GetSafeHandle(),0,0,crTrans,NULL);<br>&nbsp; }<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><br><font face=Arial>BOOL CBitmapSK::Draw( CDC *pDC, int x, int y, LPRECT lprSrc)<br>{<br>&nbsp;&nbsp; ASSERT(pDC!=NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; CDC dc;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; dc.CreateCompatibleDC(pDC);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; &nbsp;CBitmap *pOldbmp = dc.SelectObject(this);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; if (lprSrc != NULL)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; //Copies a bitmap from the source device context to this current device context<br>&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;BitBlt(x, y,&nbsp;lprSrc-&gt;right - lprSrc-&gt;left, lprSrc-&gt;bottom - lprSrc-&gt;top, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; else<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;pDC-&gt;BitBlt(x, y,&nbsp;Width(), Height(),&nbsp;&amp;dc, 0, 0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp; }</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; dc.SelectObject(pOldbmp);<br>&nbsp;&nbsp; dc.DeleteDC();<br>&nbsp;&nbsp; pOldbmp = NULL;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; return TRUE;<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><br><font face=Arial>BOOL CBitmapSK::Draw( CDC *pDC, int x, int y, LPRECT lprSrc, COLORREF crTrans, BOOL isTrans)<br>{<br>&nbsp;&nbsp;&nbsp; ASSERT(pDC!=NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp;&nbsp; if (!isTrans)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; return Draw(pDC, x, y, lprSrc);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; else<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return TransparentBitBlt(pDC-&gt;GetSafeHdc(),&nbsp;x,&nbsp;y,&nbsp;lprSrc-&gt;right - lprSrc-&gt;left,&nbsp;lprSrc-&gt;bottom - lprSrc-&gt;top, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (HBITMAP)this-&gt;GetSafeHandle(),&nbsp;lprSrc-&gt;left,&nbsp;lprSrc-&gt;top,&nbsp;crTrans,&nbsp;NULL );<br>&nbsp;&nbsp;}<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><br><font face=Arial>BOOL CBitmapSK::Fill(CDC *pDC, LPRECT lprDes, LPRECT lprSrc)<br>{&nbsp;<br>&nbsp;&nbsp; ASSERT(pDC!=NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; int widthDes, widthSrc, heightDes, heightSrc;<br>&nbsp;&nbsp; widthDes = abs(lprDes-&gt;right - lprDes-&gt;left);<br>&nbsp;&nbsp; widthSrc = abs(lprSrc-&gt;right - lprSrc-&gt;left);<br>&nbsp;&nbsp; heightDes = abs(lprDes-&gt;bottom - lprDes-&gt;top);<br>&nbsp;&nbsp; heightSrc = abs(lprSrc-&gt;bottom - lprSrc-&gt;top);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; int paddingx, paddingy, i, j;<br>&nbsp;&nbsp; paddingx = int(widthDes / widthSrc);<br>&nbsp;&nbsp; paddingy = int(heightDes / heightSrc);<br>&nbsp;<br>&nbsp;&nbsp; CDC dc;<br>&nbsp;&nbsp; dc.CreateCompatibleDC(pDC);<br>&nbsp;&nbsp; CBitmap *pOldbmp = dc.SelectObject(this);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;&nbsp; if (widthDes &lt;= widthSrc)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; if (heightDes &lt;= heightSrc)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Draw(pDC, lprDes);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; &nbsp;else<br>&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; for (i=1; i&lt;paddingy; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;BitBlt(lprDes-&gt;left,&nbsp;lprDes-&gt;top + heightSrc*(i-1),&nbsp;widthDes,&nbsp;heightSrc,&amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;BitBlt(lprDes-&gt;left,lprDes-&gt;top + heightSrc*(i-1),&nbsp;widthDes,&nbsp;heightDes - heightSrc*(i-1),&nbsp;&amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);<br>&nbsp;&nbsp; }<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{<br>&nbsp;&nbsp; if (heightDes &lt;= heightSrc)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=1; i&lt;paddingx; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;BitBlt(lprDes-&gt;left + widthSrc*(i-1),&nbsp;lprDes-&gt;top,&nbsp;widthSrc,&nbsp;heightDes,&nbsp;&amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;BitBlt(lprDes-&gt;left + widthSrc*(i-1),&nbsp;lprDes-&gt;top,&nbsp;widthDes - widthSrc*(i-1),&nbsp;heightDes,&nbsp;&amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp; else<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; for (j=1; j&lt;=paddingy; j++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=1; i&lt;=paddingx; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;BitBlt(lprDes-&gt;left + widthSrc*(i-1),lprDes-&gt;top + heightSrc*(j-1),&nbsp;widthSrc,&nbsp;heightSrc,&nbsp;&amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; pDC-&gt;BitBlt(lprDes-&gt;left + widthSrc*(i-1),&nbsp;lprDes-&gt;top + heightSrc*(j-1),widthDes - widthSrc*(i-1),&nbsp;heightSrc,&nbsp;&amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; for (i=1; i&lt;=paddingx; i++)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;BitBlt(lprDes-&gt;left + widthSrc*(i-1),&nbsp;lprDes-&gt;top + heightSrc*(j-1),&nbsp;widthSrc,&nbsp;heightDes - heightSrc*(j-1),&nbsp;&amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; pDC-&gt;BitBlt(lprDes-&gt;left + widthSrc*(i-1),&nbsp;lprDes-&gt;top + heightSrc*(j-1),&nbsp;&nbsp;widthDes - widthSrc*(i-1), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heightDes - heightSrc*(j-1),&nbsp;&amp;dc, lprSrc-&gt;left, lprSrc-&gt;top, SRCCOPY);<br>&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp; dc.SelectObject(pOldbmp);<br>&nbsp; dc.DeleteDC();<br>&nbsp; pOldbmp = NULL;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; return TRUE;<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>BOOL CBitmapSK::TransparentDraw(CDC * pDC, int x, int y, COLORREF crTrans)<br>{<br>&nbsp; ASSERT(pDC!=NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp; return TransparentBitBlt(pDC-&gt;GetSafeHdc(),&nbsp;x,&nbsp;y,&nbsp;Width(),&nbsp;Height(),&nbsp;(HBITMAP)this-&gt;GetSafeHandle(), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;0,&nbsp;crTrans,&nbsp;NULL&nbsp; );<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><br><font face=Arial>BOOL CBitmapSK::StretchDraw(CDC *pDC, LPRECT lprDes, LPRECT lprSrc)<br>{<br>&nbsp;ASSERT(pDC!=NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;if(lprDes == NULL) return FALSE;<br>&nbsp;<br>&nbsp;CDC dc;<br>&nbsp;dc.CreateCompatibleDC(pDC);<br>&nbsp;CBitmap *pOldbmp = dc.SelectObject(this);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;//SetStretchBltMode(pDC-&gt;GetSafeHdc(), COLORONCOLOR);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;if(!lprSrc)<br>&nbsp;{<br>&nbsp;&nbsp;pDC-&gt;StretchBlt(lprDes-&gt;left,&nbsp;lprDes-&gt;top,&nbsp;lprDes-&gt;right,&nbsp;&nbsp;lprDes-&gt;bottom,&nbsp;&nbsp;&amp;dc,&nbsp;&nbsp;0,&nbsp;0,&nbsp;&nbsp;Width(),&nbsp;&nbsp;Height(),&nbsp;SRCCOPY);<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{<br>&nbsp;&nbsp;pDC-&gt;StretchBlt(lprDes-&gt;left,&nbsp;lprDes-&gt;top,&nbsp;lprDes-&gt;right - lprDes-&gt;left,&nbsp;lprDes-&gt;bottom - lprDes-&gt;top, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;dc,&nbsp;lprSrc-&gt;left,&nbsp;lprSrc-&gt;top,&nbsp;lprSrc-&gt;right - lprSrc-&gt;left,&nbsp;lprSrc-&gt;bottom - lprSrc-&gt;top,SRCCOPY);<br>&nbsp;}<br>&nbsp;<br>&nbsp;dc.SelectObject(pOldbmp);<br>&nbsp;dc.DeleteDC();<br>&nbsp;pOldbmp = NULL;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;return TRUE;&nbsp;<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>BOOL CBitmapSK::StretchDraw(CDC *pDC, LPRECT lprSrc)<br>{<br>&nbsp;ASSERT(pDC!=NULL);</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;CDC dc;<br>&nbsp;dc.CreateCompatibleDC(pDC);<br>&nbsp;CBitmap *pOldbmp = dc.SelectObject(this);<br>&nbsp;<br>&nbsp;pDC-&gt;StretchBlt(lprSrc-&gt;left,&nbsp;lprSrc-&gt;top,&nbsp;lprSrc-&gt;right,&nbsp;lprSrc-&gt;bottom,&nbsp;&amp;dc, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width(),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Height(),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRCCOPY);<br>&nbsp;<br>&nbsp;dc.SelectObject(pOldbmp);<br>&nbsp;dc.DeleteDC();<br>&nbsp;pOldbmp = NULL;</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>&nbsp;return TRUE;&nbsp;<br>}</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>使用这个类实现了对话筐的换肤，测试还行。</font> </p>
<p style="MARGIN: 13pt 0cm"><font face=Arial>暂时还没发现ce下的换肤第三方控件，见过最好的也就是那个CCeButton了，还是在EVC3.0下开发的。。。</font> </p>
</span></span></span></font>
<img src ="http://www.cppblog.com/erran/aggbug/16888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2006-12-26 21:45 <a href="http://www.cppblog.com/erran/archive/2006/12/26/16888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EVC下实现WinCE软件换肤之函数TransparentBitBlt</title><link>http://www.cppblog.com/erran/archive/2006/12/26/16887.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Tue, 26 Dec 2006 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2006/12/26/16887.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/16887.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2006/12/26/16887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/16887.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/16887.html</trackback:ping><description><![CDATA[<p><font face=Verdana size=2>这个是此换肤方法的基础函数: 相关资料：Microsoft Knowledge Base Article - Q79212<br>///{{{{&nbsp; for global function<br>///HOWTO: Drawing Transparent Bitmaps&nbsp; </font><font size=2><font face=Verdana><font color=#c4573c>see: Microsoft Knowledge Base Article - Q79212<br></font>// TransparentBlt&nbsp;- Copies a bitmap transparently onto the destination DC<br>// hdcDes&nbsp;- Handle to destination device context <br>// xDes&nbsp;&nbsp;- x-coordinate of destination rectangle's upper-left corner <br>// yDes&nbsp;&nbsp;- y-coordinate of destination rectangle's upper-left corner <br>// width&nbsp;- Width of destination rectangle <br>// height&nbsp;- height of destination rectangle <br>// hbmSrc&nbsp;- Handle of the source bitmap<br>// xSrc&nbsp;&nbsp;- x-coordinate of source rectangle's upper-left corner <br>// ySrc&nbsp;&nbsp;- y-coordinate of source rectangle's upper-left corner <br>// crTrans&nbsp; - The transparent color<br>// hPal&nbsp;&nbsp;&nbsp;&nbsp; - Logical palette to be used with bitmap. Can be NULL<br>BOOL TransparentBitBlt(HDC hdcDes, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int xDes, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int yDes, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int width, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int height, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HBITMAP hbmSrc, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int xSrc, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ySrc,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COLORREF crTrans, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HPALETTE hPal<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</font> </font></p>
<p><font face=Verdana size=2>{<br>&nbsp;ASSERT(hdcDes!=NULL);//if(hdcDes == NULL) return FALSE;<br>&nbsp;ASSERT(hbmSrc!=NULL);//if(hbmSrc == NULL) return FALSE;</font> </p>
<p><font face=Verdana size=2>&nbsp;CDC dc, memDC, maskDC, tempDC;<br>&nbsp;dc.Attach(hdcDes);<br>&nbsp;maskDC.CreateCompatibleDC(&amp;dc);<br>&nbsp;CBitmap maskBmp;<br>&nbsp;<br>&nbsp;//add these to store return of SelectObject() calls<br>&nbsp;CBitmap *pOldMemBmp = NULL;<br>&nbsp;CBitmap *pOldMaskBmp = NULL;<br>&nbsp;HBITMAP hOldTempBmp = NULL;<br>&nbsp;<br>&nbsp;memDC.CreateCompatibleDC(&amp;dc);<br>&nbsp;tempDC.CreateCompatibleDC(&amp;dc);<br>&nbsp;CBitmap bmpImage;<br>&nbsp;bmpImage.CreateCompatibleBitmap(&amp;dc, width, height);<br>&nbsp;pOldMemBmp = memDC.SelectObject(&amp;bmpImage);<br>&nbsp;<br>&nbsp;// Select and realize the palette<br>&nbsp;if( dc.GetDeviceCaps(RASTERCAPS) &amp; RC_PALETTE &amp;&amp; hPal )<br>&nbsp;{<br>&nbsp;&nbsp;::SelectPalette(dc, hPal, FALSE);<br>&nbsp;&nbsp;dc.RealizePalette();<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;::SelectPalette(memDC, hPal, FALSE);<br>&nbsp;}<br>&nbsp;<br>&nbsp;hOldTempBmp = (HBITMAP)::SelectObject(tempDC.m_hDC, hbmSrc);<br>&nbsp;<br>&nbsp;memDC.BitBlt(0, 0, width, height, &amp;tempDC, xSrc, ySrc, SRCCOPY);<br>&nbsp;<br>&nbsp;// Create monochrome bitmap for the mask<br>&nbsp;maskBmp.CreateBitmap(width, height, 1, 1, NULL);<br>&nbsp;pOldMaskBmp = maskDC.SelectObject(&amp;maskBmp);<br>&nbsp;memDC.SetBkColor(crTrans);<br>&nbsp;<br>&nbsp;// Create the mask from the memory DC<br>&nbsp;maskDC.BitBlt(0, 0, width, height, &amp;memDC, 0, 0, SRCCOPY);<br>&nbsp;<br>&nbsp;// Set the background in memDC to black. Using SRCPAINT with black <br>&nbsp;// and any other color results in the other color, thus making <br>&nbsp;// black the transparent color<br>&nbsp;memDC.SetBkColor(RGB(0,0,0));<br>&nbsp;memDC.SetTextColor(RGB(255,255,255));<br>&nbsp;memDC.BitBlt(0, 0, width, height, &amp;maskDC, 0, 0, SRCAND);<br>&nbsp;<br>&nbsp;// Set the foreground to black. See comment above.<br>&nbsp;dc.SetBkColor(RGB(255,255,255));<br>&nbsp;dc.SetTextColor(RGB(0,0,0));<br>&nbsp;dc.BitBlt(xDes, yDes, width, height, &amp;maskDC, 0, 0, SRCAND);<br>&nbsp;<br>&nbsp;// Combine the foreground with the background<br>&nbsp;dc.BitBlt(xDes, yDes, width, height, &amp;memDC, 0, 0, SRCPAINT);<br>&nbsp;<br>&nbsp;<br>&nbsp;if (hOldTempBmp)<br>&nbsp;&nbsp;::SelectObject(tempDC.m_hDC, hOldTempBmp);<br>&nbsp;if (pOldMaskBmp)<br>&nbsp;&nbsp;maskDC.SelectObject(pOldMaskBmp);<br>&nbsp;if (pOldMemBmp)<br>&nbsp;&nbsp;memDC.SelectObject(pOldMemBmp);<br>&nbsp;<br>&nbsp;dc.Detach();</font> </p>
<p><font face=Verdana size=2>&nbsp;maskBmp.DeleteObject();<br>&nbsp;bmpImage.DeleteObject();</font> </p>
<p><font face=Verdana size=2>&nbsp;maskDC.DeleteDC();<br>&nbsp;memDC.DeleteDC();<br>&nbsp;tempDC.DeleteDC();</font> </p>
<p><font face=Verdana size=2>&nbsp;pOldMemBmp = NULL;<br>&nbsp;pOldMaskBmp = NULL;<br>&nbsp;hOldTempBmp = NULL;</font> </p>
<p><font face=Verdana size=2>&nbsp;return TRUE;<br>}</font> </p>
<p><font face=Verdana size=2>///}}} for global function</font> </p>
<p><font face=Verdana size=2></font>&nbsp;</p>
<p><font face=Verdana size=2>另三个很有意思的类，从高手那&#8220;盗&#8221;来的，呵呵:</font> </p>
<p><br><font face=Verdana size=2>class CWinRect: public CRect<br>{<br>public:<br>&nbsp;CWinRect(HWND hWnd)<br>&nbsp;{<br>&nbsp;&nbsp;::GetWindowRect(hWnd, this);<br>&nbsp;}<br>&nbsp;CWinRect(const CWnd *pWnd)<br>&nbsp;{<br>&nbsp;&nbsp;::GetWindowRect(pWnd-&gt;GetSafeHwnd(), this);<br>&nbsp;}</font> </p>
<p><font face=Verdana size=2>};</font> </p>
<p><font face=Verdana size=2>class CWinText: public CString<br>{<br>public:<br>&nbsp;CWinText(HWND hWnd)<br>&nbsp;{<br>&nbsp;&nbsp;(CWnd::FromHandle(hWnd))-&gt;GetWindowText(*this);&nbsp;<br>&nbsp;}<br>&nbsp;CWinText(const CWnd *pWnd)<br>&nbsp;{<br>&nbsp;&nbsp;pWnd-&gt;GetWindowText(*this);<br>&nbsp;}<br>};</font> </p>
<p><br><font face=Verdana size=2>class CClientRect: public CRect<br>{<br>public:<br>&nbsp;CClientRect(HWND hWnd)<br>&nbsp;{<br>&nbsp;&nbsp;::GetClientRect(hWnd, this);<br>&nbsp;}<br>&nbsp;CClientRect(CWnd *pWnd)<br>&nbsp;{<br>&nbsp;&nbsp;::GetClientRect(pWnd-&gt;GetSafeHwnd(), this);<br>&nbsp;}<br>};</font> </p>
<img src ="http://www.cppblog.com/erran/aggbug/16887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2006-12-26 21:43 <a href="http://www.cppblog.com/erran/archive/2006/12/26/16887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows CE下ActiveX 控件的使用</title><link>http://www.cppblog.com/erran/archive/2006/05/30/7908.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Tue, 30 May 2006 15:46:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2006/05/30/7908.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/7908.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2006/05/30/7908.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/7908.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/7908.html</trackback:ping><description><![CDATA[<p class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><span style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体"><font face=宋体><font size=2><br>在<span lang=EN-US>WinCe</span>下使用<span lang=EN-US>ActiveX</span>控件与<span lang=EN-US>Window(2k,xp)</span>下最大的不同之处就是要编译两个版本的<span lang=EN-US>ocx</span>，一个安装到<span lang=EN-US>window</span>上，这样就可以在<span lang=EN-US>EVC</span>环境下使用该<span lang=EN-US>ocx</span>进行编程了，一个安装到<span lang=EN-US>wince</span>上，用于使用这个<span lang=EN-US>ocx</span>的程序调用。<br><span lang=EN-US><o:p></o:p></span></font></font></span></p>
<p class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><font face=宋体><font size=2><span lang=EN-US style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体"><span style="mso-tab-count: 1"><br>&nbsp;&nbsp;&nbsp; </span></span><span style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">在此做了个简单的<span lang=EN-US>ocx</span>试了试，能够在<span lang=EN-US>EVC4.2/</span>模拟器<span lang=EN-US>wince4.2</span>下成功。具体步骤如下：<br><span lang=EN-US><o:p></o:p></span></span></font></font></p>
<p class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><font face=宋体><font size=2><span lang=EN-US style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体"><span style="mso-tab-count: 1"><br>&nbsp;&nbsp;&nbsp; </span>1. </span><span style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">开发<span lang=EN-US>CE</span>版<span lang=EN-US>OCX</span>控件。先在<span lang=EN-US>EVC</span>中开发自己的<span lang=EN-US>OCX</span>控件。编译成功以后，<span lang=EN-US>ocx</span>会被自动下载到模拟器里去。<br><span lang=EN-US><o:p></o:p></span></span></font></font></p>
<p class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><font face=宋体><font size=2><span lang=EN-US style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体"><span style="mso-tab-count: 1"><br>&nbsp;&nbsp;&nbsp; </span>2. </span><span style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">在模拟器中注册该控件<span lang=EN-US>.</span>注册方法：用<span lang=EN-US>EVC</span>的<span lang=EN-US>remote filter viewer</span>加载目录<span lang=EN-US>C:\Program Files\Microsoft eMbedded C++ 4.0\EVC\WCE400\TARGET\X86\regsvrce.exe</span>到模拟器<span lang=EN-US>windows</span>目录下。或者直接拷贝该<span lang=EN-US>regsvrce.exe</span>到模拟器里。拷贝成功后，在模拟器上运行<span lang=EN-US>regsvrce.exe</span>，注册控件，如运行&#8220;<span lang=EN-US>regsvrce CEActivexBtn.ocx</span>&#8221;<span lang=EN-US>,</span>即注册了<span lang=EN-US>CEActivexBtn </span>控件。<br><span lang=EN-US><o:p></o:p></span></span></font></font></p>
<p class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><font face=宋体><font size=2><span lang=EN-US style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体"><span style="mso-tab-count: 1"><br>&nbsp;&nbsp;&nbsp; </span>4. </span><span style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">开发<span lang=EN-US>win32</span>版<span lang=EN-US>OCX</span>控件。在<span lang=EN-US>VC</span>中创建一个和以上工程名字一样的工程（必须一样，否则回不成功），把该工程（<span lang=EN-US>vc</span>工程）下的 两个工程文件<span lang=EN-US>dsw</span>和<span lang=EN-US>dsp</span>拷贝到<span lang=EN-US>CE</span>版控件工程的目录下，和<span lang=EN-US>vcw</span>和<span lang=EN-US>vcp</span>放到同一个目录下，然后打开这个目录下的<span lang=EN-US>VC</span>工程，发现编译配置里选择的是&#8220;<span lang=EN-US>Win32 Unicode Debug</span>&#8221;，编译，可能会产生链接错误，即差<span lang=EN-US>mfc42ud;lib</span>。当然如果<span lang=EN-US>VC</span>安装的很完善的话，不会产生这个错误。不过也没关系，把那个配置改了，改成&#8220;<span lang=EN-US>Win32 Debug</span>&#8221;，这样就能编译成功了。编译完成，<span lang=EN-US>VC</span>会自动注册该<span lang=EN-US>win32</span>版的<span lang=EN-US>ocx</span>控件。<br><span lang=EN-US><o:p></o:p></span></span></font></font></p>
<p class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><span style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体"><font face=宋体><font size=2><br>　　<span lang=EN-US>5</span>．在<span lang=EN-US>EVC</span>上添加该<span lang=EN-US>Win32</span>版的（不是<span lang=EN-US>CE</span>版的）<span lang=EN-US>ocx</span>控件。方法，创建一个<span lang=EN-US>demo</span>工程，在该工程的对话筐编辑器里，右键菜单&#8220;<span lang=EN-US>Insert ActiveX Controls</span>&#8221;，出现<span lang=EN-US>Insert ActiveX Controls</span>窗口，点击&#8220;<span lang=EN-US>Add Controls</span>&#8221;按钮，找到用<span lang=EN-US>VC</span>编译的<span lang=EN-US>Win32</span>版<span lang=EN-US>ocx</span>控件，添加。<br><span lang=EN-US><o:p></o:p></span></font></font></span></p>
<p class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><span style="mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体"><font face=宋体><font size=2><br>　　<span lang=EN-US>OK</span>！现在可以在<span lang=EN-US>EVC</span>上调用该<span lang=EN-US>ocx</span>编程了。<br><span lang=EN-US><o:p></o:p></span></font></font></span></p>
<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=2><br>　　在板板上使用时，注册好就可以了</font> </span>
<img src ="http://www.cppblog.com/erran/aggbug/7908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2006-05-30 23:46 <a href="http://www.cppblog.com/erran/archive/2006/05/30/7908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EVC实现WIN CE下截屏并且保存到文件[By Erran] </title><link>http://www.cppblog.com/erran/archive/2006/05/14/7094.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 13 May 2006 17:34:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2006/05/14/7094.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/7094.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2006/05/14/7094.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/7094.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/7094.html</trackback:ping><description><![CDATA[<font size=2><br><br>在WinCE中, 由于WinCE的精简,有很多win32下的标准API不支持,所以有很多在vc上能够轻易实现的功能, 在evc中有点难度,必须变通一下,就拿截取屏幕来说,一个常用的函数GetDIBits在wince就Unsupported.当时为了实现这个功能,颇费了了一番心血，当然其主要还是因为对api不是很熟悉。</font>
<p><font size=2>最初使用的截屏方法说来还真有些丢人，一个一个点的取得颜色值，再保存到bmp文件中去，这样程序运行的速度超慢，保存一个800X600的bmp差不多要一两分钟（研华8251板），觉得有些不对头，决定想办法改进一下，就使劲地看了一下Charles Petzold先生的《Programming Windows》（这本书很经典，值得好好研究一下），终于把时间缩短到几秒钟了，下面这个函数在evc和vc下都test pass(不用更改)，有不足之处欢迎指正，函数：</font> </p>
<p><font size=2><strong><font color=#2828c7>// this function create a bmp file to save the current screen;<br>// supported eVC++ 4.0 (wince 4.0) and vc++ 6.0 , test pass;</font> </strong><br></font><font size=2><font color=#000000>void CSnapDlg::OnScreenSave(const char *filename)<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp; HDC&nbsp; hScrDC, hMemDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; int&nbsp; width, height;&nbsp;<br></font>&nbsp;<br><font color=#2828c7>&nbsp;<strong>//the pointer will save all pixel point's color value</strong></font><br>&nbsp;BYTE&nbsp; *lpBitmapBits = NULL; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;<strong><font color=#2828c7>//creates a device context for the screen device</font></strong><br>&nbsp;&nbsp;&nbsp; hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);</font> </p>
<p><font size=2>&nbsp;</font> <font size=2><font color=#2828c7><strong>//get the screen point size<br></strong></font>&nbsp;&nbsp;&nbsp; width = GetDeviceCaps(hScrDC, HORZRES);<br>&nbsp;&nbsp;&nbsp; height = GetDeviceCaps(hScrDC, VERTRES);</font> </p>
<p><font size=2>&nbsp;&nbsp;&nbsp; <strong><font color=#2828c7>//creates a memory device context (DC) compatible with the screen device</font></strong>(hScrDC)&nbsp; <br>&nbsp;&nbsp;&nbsp; hMemDC = CreateCompatibleDC(hScrDC);</font> </p>
<p><strong><font color=#2828c7 size=2>&nbsp;//initialise the struct BITMAPINFO for the bimap infomation，</font> <font color=#2828c7><br><font size=2>&nbsp;//in order to use the function CreateDIBSection<br>&nbsp;//</font> </font></strong><font size=2><strong><font color=#2828c7>on wince os, each pixel stored by 24 bits(biBitCount=24)&nbsp;<br>&nbsp;//and no compressing(biCompression=0)</font> </strong><br>&nbsp;&nbsp;&nbsp; BITMAPINFO RGB24BitsBITMAPINFO; <br>&nbsp;&nbsp;&nbsp; ZeroMemory(&amp;RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));<br>&nbsp;&nbsp;&nbsp; RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);<br>&nbsp;&nbsp;&nbsp; RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;<br>&nbsp;&nbsp;&nbsp; RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;<br>&nbsp;&nbsp;&nbsp; RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;<br>&nbsp;&nbsp;&nbsp; RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;<br>&nbsp;&nbsp; <br>&nbsp;</font> <font size=2><strong><font color=#2828c7>//use the function CreateDIBSection and SelectObject&nbsp;<br>&nbsp;//in order to get the bimap pointer : lpBitmapBits</font> </strong><br>&nbsp;&nbsp;&nbsp; HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&amp;RGB24BitsBITMAPINFO, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIB_RGB_COLORS, (void **)&amp;lpBitmapBits, NULL, 0);<br>&nbsp;HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);</font> </p>
<p><font size=2>&nbsp;<strong><font color=#2828c7>// copy the screen dc to the memory dc</font></strong><br>&nbsp;BitBlt(hMemDC, 0, 0, width, height,&nbsp;hScrDC, 0, 0, SRCCOPY);<br>&nbsp;<br></font><strong><font color=#2828c7 size=2>&nbsp;//if you only want to get the every pixel color value, <br>&nbsp;//you can begin here and the following part of this function will be unuseful;<br>&nbsp;//the following part is in order to write file;</font> </strong></p>
<p><font size=2><font color=#2828c7><strong>&nbsp;//bimap file header in order to write bmp file</strong> </font><br>&nbsp;BITMAPFILEHEADER bmBITMAPFILEHEADER;<br>&nbsp;ZeroMemory(&amp;bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));<br>&nbsp;bmBITMAPFILEHEADER.bfType = 0x4d42;&nbsp; //bmp&nbsp; <br>&nbsp;&nbsp;&nbsp; bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);<br>&nbsp;&nbsp;&nbsp; bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3); ///3=(24 / 8)<br>&nbsp;<br><strong><font color=#2828c7>&nbsp;//write into file</font></strong><br>&nbsp;FILE *mStream = NULL;<br>&nbsp;if((mStream = fopenfilename, "wb")))<br>&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;<strong><font color=#2828c7>//write bitmap file header</font></strong><br>&nbsp;&nbsp;fwrite(&amp;bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);<br>&nbsp;&nbsp;<strong><font color=#2828c7>//write bitmap info</font></strong><br>&nbsp;&nbsp;fwrite(&amp;(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);<br>&nbsp;&nbsp;<strong><font color=#2828c7>//write bitmap pixels data</font></strong><br>&nbsp;&nbsp;fwrite(lpBitmapBits, 3*width*height, 1, mStream);<br>&nbsp;</font> <font size=2><strong><font color=#2828c7>&nbsp;//close file<br></font></strong>&nbsp;&nbsp;fclose(mStream);<br>&nbsp;}<br>&nbsp;<br><strong><font color=#2828c7>&nbsp;//delete</font></strong><br>&nbsp;DeleteObject(hMemDC);<br>&nbsp;DeleteObject(hScrDC);<br>&nbsp;DeleteObject(directBmp);<br>&nbsp;DeleteObject(previousObject);<br>}</font> </p>
<p><font size=2>还是用英语作了注释，虽然英语学的很糟糕，还是觉得这个习惯比较好~~ .. <br><br><br></font></p>
<img src ="http://www.cppblog.com/erran/aggbug/7094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2006-05-14 01:34 <a href="http://www.cppblog.com/erran/archive/2006/05/14/7094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>