• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Welcome to ErranLi's Blog!

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              106 Posts :: 1 Stories :: 97 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(12)

            搜索

            •  

            積分與排名

            • 積分 - 175090
            • 排名 - 151

            最新評論

            閱讀排行榜

            由于在wince下不支持hook,所以對ce下的軟件換膚,會很慧心,不過,曾經看到過一個國外的網站上有pocket下實現hook的代碼,沒讀懂,呵呵,自己太水了,這就涉及到另外一個問題了,還沒有找到實現hook的方法,所有要另外想辦法了,所以不管怎么樣都要重寫控件,參考了一些VC實現的換膚,在此實現了基本類CBitmapSK。其中有個郁悶的地方是evc對CRgn支持的不全面,對任意形狀的窗口實現有些麻煩,所以有個重要的函數不能實現,要想其他的辦法實現,
            //////////////////////////////////////////////////////////////////////
            //
            // BaseSK.h: interface for the CBitmapSK class.
            //
            // writer : erran
            //
            // time:  2006-03-10
            //
            //////////////////////////////////////////////////////////////////////

            class CBitmapSK : public CBitmap 
            {
            public:
             
             CBitmapSK();
             virtual ~CBitmapSK();

             //load bitmap by resource file path
             BOOL LoadBitmapEx(LPCTSTR lpszFileName);

             //load bitmap by resource name or ID
             BOOL LoadBitmapEx(LPCTSTR lpszResourceName, UINT nIDResource);

             //attaches a hBitmap to a CBitmap object.
             BOOL Attach(HBITMAP hbmp)
             {
                 return CBitmap::Attach(hbmp);
             }
             
             void Size(int &width, int &height)
             {
                BITMAP bm;
                memset(&bm, 0, sizeof(bm));
                CBitmap::GetBitmap(&bm);
                width = bm.bmWidth;
                height = bm.bmHeight;
             }

             //bitmap width
             int Width(void)
             {
                BITMAP bm;
                memset(&bm, 0, sizeof(bm));
                CBitmap::GetBitmap(&bm);
                return bm.bmWidth;
             }

             //bitmap height
             int Height()
             {
                BITMAP bm;
                memset(&bm, 0, sizeof(bm));
                CBitmap::GetBitmap(&bm);
                return bm.bmHeight;
             }

             /////// src(bmp) ---> Des(pDC)

             //draw current bitmap to device(pDC rect(lpr)) 
             BOOL Draw(CDC *pDC, LPRECT lprDes);
             //draw current bitmap to device(pDC rect(lpr)) , transparent 
             BOOL Draw(CDC *pDC, LPRECT lprDes, COLORREF crTrans, BOOL isTrans);

             //draw sub bitmap(the rect lprSrc of current bitmap) to special point( the begin point (x,y) of pDC device)
             BOOL Draw(CDC *pDC, int x, int y, LPRECT lprSrc);
             //draw sub bitmap to special point
             BOOL Draw(CDC *pDC, int x, int y, LPRECT lprSrc, COLORREF crTrans, BOOL isTrans);

             BOOL Fill(CDC *pDC, LPRECT lprDes);
             BOOL Fill(CDC *pDC, LPRECT lprDes, COLORREF crTrans, BOOL isTrans);

             BOOL Fill(CDC *pDC, LPRECT lprDes, LPRECT lprSrc); 
             BOOL Fill(CDC *pDC, LPRECT lprDes, LPRECT lprSrc, COLORREF crTrans, BOOL isTrans);

             //Drawing Transparent Bitmaps,Copies a bitmap transparently onto the destination DC
             BOOL TransparentDraw(CDC * pDC, int x, int y, COLORREF crColour);
             

             //Copies a bitmap from a source rectangle into a destination rectangle,
             //stretching or compressing the bitmap if necessary to fit the dimensions of the destination rectangle.
             BOOL StretchDraw(CDC *pDC, LPRECT lprDes, LPRECT lprSrc);
             //Copies a bitmap from a source rectangle into a destination rectangle,
             //stretching or compressing the bitmap if necessary to fit the dimensions of the destination rectangle. 
             BOOL StretchDraw(CDC *pDC, LPRECT lprSrc);

             //make a region from bitmap, It will show as a window     ::: faulse function :::
             //HRGN CreateRegion(COLORREF crColour, BOOL isTrans = TRUE);  

            };

             


            ////for class CBitmapSK

            CBitmapSK::CBitmapSK()
            {
             
            }

            CBitmapSK::~CBitmapSK()
            {
             
            }

            BOOL CBitmapSK::LoadBitmapEx(LPCTSTR lpszFileName)
            {
               DeleteObject();

               ASSERT(m_hObject==NULL);

               HBITMAP hBitmap = NULL;

               hBitmap = (HBITMAP)::LoadImage(0, lpszFileName, IMAGE_BITMAP, 0, 0, 0);

               if(hBitmap == NULL) return FALSE;

               return CBitmap::Attach(hBitmap);
            }

            BOOL CBitmapSK::LoadBitmapEx(LPCTSTR lpszResourceName, UINT nIDResource)
            {
               DeleteObject();

               ASSERT(m_hObject==NULL);
             
               if (lpszResourceName != NULL)
              {
                return CBitmap::LoadBitmap(lpszResourceName);
              }

              if (nIDResource != 0)
              {
                 return CBitmap::LoadBitmap(nIDResource);
              }
             
              return FALSE;
            }

            BOOL CBitmapSK::Draw(CDC *pDC, LPRECT lprDes)
            {
              ASSERT(pDC!=NULL);

              CDC dc;

              dc.CreateCompatibleDC(pDC);

              CBitmap *bmp = dc.SelectObject(this); 

              pDC->BitBlt(lprDes->left, lprDes->top,
                lprDes->right - lprDes->left, lprDes->bottom - lprDes->top,
                &dc, 0, 0, SRCCOPY);

              dc.SelectObject(bmp);  

              dc.DeleteDC();
              bmp = NULL;

              return TRUE;
            }

            BOOL CBitmapSK::Draw(CDC *pDC, LPRECT lprDes, COLORREF crTrans, BOOL isTrans)
            {
              ASSERT(pDC!=NULL);

              if (!isTrans)
              {
                return Draw(pDC, lprDes);
              }
              else
              {
                return TransparentBitBlt(pDC->GetSafeHdc(),
                         lprDes->left,lprDes->top,Width(),Height(),
                         (HBITMAP)this->GetSafeHandle(),0,0,crTrans,NULL);
              }
            }


            BOOL CBitmapSK::Draw( CDC *pDC, int x, int y, LPRECT lprSrc)
            {
               ASSERT(pDC!=NULL);

               CDC dc;

               dc.CreateCompatibleDC(pDC);

               CBitmap *pOldbmp = dc.SelectObject(this);

               if (lprSrc != NULL)
               {
                 //Copies a bitmap from the source device context to this current device context
                 pDC->BitBlt(x, y, lprSrc->right - lprSrc->left, lprSrc->bottom - lprSrc->top,
                           &dc, lprSrc->left, lprSrc->top, SRCCOPY);
               }
               else
               {
                  pDC->BitBlt(x, y, Width(), Height(), &dc, 0, 0, SRCCOPY);
               }

               dc.SelectObject(pOldbmp);
               dc.DeleteDC();
               pOldbmp = NULL;

               return TRUE;
            }


            BOOL CBitmapSK::Draw( CDC *pDC, int x, int y, LPRECT lprSrc, COLORREF crTrans, BOOL isTrans)
            {
                ASSERT(pDC!=NULL);

                if (!isTrans)
               {
                 return Draw(pDC, x, y, lprSrc);
                }
               else
              {
                return TransparentBitBlt(pDC->GetSafeHdc(), x, y, lprSrc->right - lprSrc->left, lprSrc->bottom - lprSrc->top,
                     (HBITMAP)this->GetSafeHandle(), lprSrc->left, lprSrc->top, crTrans, NULL );
              }
            }


            BOOL CBitmapSK::Fill(CDC *pDC, LPRECT lprDes, LPRECT lprSrc)

               ASSERT(pDC!=NULL);

               int widthDes, widthSrc, heightDes, heightSrc;
               widthDes = abs(lprDes->right - lprDes->left);
               widthSrc = abs(lprSrc->right - lprSrc->left);
               heightDes = abs(lprDes->bottom - lprDes->top);
               heightSrc = abs(lprSrc->bottom - lprSrc->top);

               int paddingx, paddingy, i, j;
               paddingx = int(widthDes / widthSrc);
               paddingy = int(heightDes / heightSrc);
             
               CDC dc;
               dc.CreateCompatibleDC(pDC);
               CBitmap *pOldbmp = dc.SelectObject(this);

               if (widthDes <= widthSrc)        
              {
                if (heightDes <= heightSrc)
               {
                  Draw(pDC, lprDes);
                }
               else
               {   
                 for (i=1; i<paddingy; i++)
                 {
                    pDC->BitBlt(lprDes->left, lprDes->top + heightSrc*(i-1), widthDes, heightSrc,&dc, lprSrc->left, lprSrc->top, SRCCOPY);
                 }
                 pDC->BitBlt(lprDes->left,lprDes->top + heightSrc*(i-1), widthDes, heightDes - heightSrc*(i-1), &dc, lprSrc->left, lprSrc->top, SRCCOPY);
               }
             }
             else
             {
               if (heightDes <= heightSrc)
               {
                  for (i=1; i<paddingx; i++)
                 {
                     pDC->BitBlt(lprDes->left + widthSrc*(i-1), lprDes->top, widthSrc, heightDes, &dc, lprSrc->left, lprSrc->top, SRCCOPY);
                 }
                 pDC->BitBlt(lprDes->left + widthSrc*(i-1), lprDes->top, widthDes - widthSrc*(i-1), heightDes, &dc, lprSrc->left, lprSrc->top, SRCCOPY);
               }
               else
               {
                 for (j=1; j<=paddingy; j++)
                {
                   for (i=1; i<=paddingx; i++)
                   {
                       pDC->BitBlt(lprDes->left + widthSrc*(i-1),lprDes->top + heightSrc*(j-1), widthSrc, heightSrc, &dc, lprSrc->left, lprSrc->top, SRCCOPY);    
                   }
                   pDC->BitBlt(lprDes->left + widthSrc*(i-1), lprDes->top + heightSrc*(j-1),widthDes - widthSrc*(i-1), heightSrc, &dc, lprSrc->left, lprSrc->top, SRCCOPY);
                }
               }
               for (i=1; i<=paddingx; i++)
               {
                  pDC->BitBlt(lprDes->left + widthSrc*(i-1), lprDes->top + heightSrc*(j-1), widthSrc, heightDes - heightSrc*(j-1), &dc, lprSrc->left, lprSrc->top, SRCCOPY);
               }
               pDC->BitBlt(lprDes->left + widthSrc*(i-1), lprDes->top + heightSrc*(j-1),  widthDes - widthSrc*(i-1),
                  heightDes - heightSrc*(j-1), &dc, lprSrc->left, lprSrc->top, SRCCOPY);
              }
             
              dc.SelectObject(pOldbmp);
              dc.DeleteDC();
              pOldbmp = NULL;

              return TRUE;
            }

            BOOL CBitmapSK::TransparentDraw(CDC * pDC, int x, int y, COLORREF crTrans)
            {
              ASSERT(pDC!=NULL);

              return TransparentBitBlt(pDC->GetSafeHdc(), x, y, Width(), Height(), (HBITMAP)this->GetSafeHandle(),
                    0, 0, crTrans, NULL  );
            }


            BOOL CBitmapSK::StretchDraw(CDC *pDC, LPRECT lprDes, LPRECT lprSrc)
            {
             ASSERT(pDC!=NULL);

             if(lprDes == NULL) return FALSE;
             
             CDC dc;
             dc.CreateCompatibleDC(pDC);
             CBitmap *pOldbmp = dc.SelectObject(this);

             //SetStretchBltMode(pDC->GetSafeHdc(), COLORONCOLOR);

             if(!lprSrc)
             {
              pDC->StretchBlt(lprDes->left, lprDes->top, lprDes->right,  lprDes->bottom,  &dc,  0, 0,  Width(),  Height(), SRCCOPY);
             }
             else
             {
              pDC->StretchBlt(lprDes->left, lprDes->top, lprDes->right - lprDes->left, lprDes->bottom - lprDes->top,
                  &dc, lprSrc->left, lprSrc->top, lprSrc->right - lprSrc->left, lprSrc->bottom - lprSrc->top,SRCCOPY);
             }
             
             dc.SelectObject(pOldbmp);
             dc.DeleteDC();
             pOldbmp = NULL;

             return TRUE; 
            }

            BOOL CBitmapSK::StretchDraw(CDC *pDC, LPRECT lprSrc)
            {
             ASSERT(pDC!=NULL);

             CDC dc;
             dc.CreateCompatibleDC(pDC);
             CBitmap *pOldbmp = dc.SelectObject(this);
             
             pDC->StretchBlt(lprSrc->left, lprSrc->top, lprSrc->right, lprSrc->bottom, &dc,
                 0,      0,      Width(),      Height(),     SRCCOPY);
             
             dc.SelectObject(pOldbmp);
             dc.DeleteDC();
             pOldbmp = NULL;

             return TRUE; 
            }

            使用這個類實現了對話筐的換膚,測試還行。

            暫時還沒發現ce下的換膚第三方控件,見過最好的也就是那個CCeButton了,還是在EVC3.0下開發的。。。

            posted on 2006-12-26 21:45 erran 閱讀(2724) 評論(2)  編輯 收藏 引用 所屬分類: WinCE

            Feedback

            # re: EVC下實現WinCE軟件換膚之換膚基礎類CBitmapSK 2007-06-20 01:26 落花飄逸
            呀,這是你自己寫的?該不會是偷我的吧,HOHO~
            收藏了  回復  更多評論
              

            # re: EVC下實現WinCE軟件換膚之換膚基礎類CBitmapSK[未登錄] 2007-06-20 10:38 erran
            狂暈.........................  回復  更多評論
              

            久久综合视频网| 99久久精品国产麻豆| 久久w5ww成w人免费| 久久久久无码中| 99久久这里只有精品| 久久只有这精品99| 国产精品欧美久久久久天天影视| 亚洲欧洲精品成人久久曰影片 | 亚洲AV无码久久精品蜜桃| 亚洲乱亚洲乱淫久久| 久久婷婷五月综合国产尤物app| 久久精品亚洲精品国产欧美| 九九99精品久久久久久| 99久久精品国产一区二区| 欧美激情精品久久久久久久九九九| 91精品国产91久久久久福利| 成人午夜精品无码区久久| 久久综合九色欧美综合狠狠| 伊人久久综在合线亚洲2019| 2021精品国产综合久久| 久久精品无码一区二区无码| 国产69精品久久久久9999APGF| 亚洲а∨天堂久久精品| 久久精品国产精品亚洲| 精品久久久久久久中文字幕 | 久久99精品国产麻豆蜜芽| 国产成人精品久久一区二区三区 | 久久91综合国产91久久精品| 亚洲AV日韩AV天堂久久| 一本一本久久aa综合精品| 久久人人爽人人爽人人av东京热 | 精品视频久久久久| 97久久精品人人澡人人爽| 亚洲国产精品久久久久| 亚洲国产天堂久久综合网站| 久久精品国产99国产电影网| 久久免费精品一区二区| 欧美午夜A∨大片久久| 久久久无码精品亚洲日韩软件| 久久精品国产一区二区三区| 久久精品国产72国产精福利|