• <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++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              106 Posts :: 1 Stories :: 97 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(12)

            搜索

            •  

            積分與排名

            • 積分 - 175922
            • 排名 - 151

            最新評(píng)論

            閱讀排行榜

            由于在wince下不支持hook,所以對(duì)ce下的軟件換膚,會(huì)很慧心,不過,曾經(jīng)看到過一個(gè)國外的網(wǎng)站上有pocket下實(shí)現(xiàn)hook的代碼,沒讀懂,呵呵,自己太水了,這就涉及到另外一個(gè)問題了,還沒有找到實(shí)現(xiàn)hook的方法,所有要另外想辦法了,所以不管怎么樣都要重寫控件,參考了一些VC實(shí)現(xiàn)的換膚,在此實(shí)現(xiàn)了基本類CBitmapSK。其中有個(gè)郁悶的地方是evc對(duì)CRgn支持的不全面,對(duì)任意形狀的窗口實(shí)現(xiàn)有些麻煩,所以有個(gè)重要的函數(shù)不能實(shí)現(xiàn),要想其他的辦法實(shí)現(xiàn),
            //////////////////////////////////////////////////////////////////////
            //
            // 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; 
            }

            使用這個(gè)類實(shí)現(xiàn)了對(duì)話筐的換膚,測(cè)試還行。

            暫時(shí)還沒發(fā)現(xiàn)ce下的換膚第三方控件,見過最好的也就是那個(gè)CCeButton了,還是在EVC3.0下開發(fā)的。。。

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

            Feedback

            # re: EVC下實(shí)現(xiàn)WinCE軟件換膚之換膚基礎(chǔ)類CBitmapSK 2007-06-20 01:26 落花飄逸
            呀,這是你自己寫的?該不會(huì)是偷我的吧,HOHO~
            收藏了  回復(fù)  更多評(píng)論
              

            # re: EVC下實(shí)現(xiàn)WinCE軟件換膚之換膚基礎(chǔ)類CBitmapSK[未登錄] 2007-06-20 10:38 erran
            狂暈.........................  回復(fù)  更多評(píng)論
              

            亚洲国产香蕉人人爽成AV片久久| 国产精品久久新婚兰兰 | 亚洲综合久久夜AV | 中文字幕久久精品无码| 久久本道伊人久久| 亚洲精品乱码久久久久久蜜桃| 久久国产精品99精品国产| 久久久精品久久久久久 | 三级片免费观看久久| 久久久老熟女一区二区三区| 久久久久久极精品久久久 | 亚洲国产成人久久精品99| 久久综合狠狠综合久久| 国产精品熟女福利久久AV| 亚洲精品tv久久久久| 日本精品久久久久中文字幕8| 精品国产99久久久久久麻豆| 久久久久久毛片免费看| 狠狠狠色丁香婷婷综合久久俺| 亚洲人成无码久久电影网站| 国产毛片久久久久久国产毛片 | 国产香蕉97碰碰久久人人| 国内高清久久久久久| 无夜精品久久久久久| 狠狠色丁香婷婷综合久久来来去| 久久精品夜夜夜夜夜久久| 国产美女亚洲精品久久久综合| 亚洲国产成人久久综合碰| 久久男人中文字幕资源站| 国产精品免费看久久久香蕉| 韩国三级大全久久网站| 日韩AV无码久久一区二区| 国产精品久久久久蜜芽| 亚洲欧洲精品成人久久曰影片 | 国产一久久香蕉国产线看观看| 亚洲国产精品无码久久久不卡| 久久只有这里有精品4| 久久中文字幕人妻熟av女| 少妇熟女久久综合网色欲| 久久九九久精品国产免费直播| 久久亚洲中文字幕精品一区|