• <table id="x5mq0"><track id="x5mq0"></track></table>
  • <code id="x5mq0"><nobr id="x5mq0"><sub id="x5mq0"></sub></nobr></code>

      <pre id="x5mq0"><small id="x5mq0"><p id="x5mq0"></p></small></pre>
    1. <pre id="x5mq0"><small id="x5mq0"><track id="x5mq0"></track></small></pre>

    2. <th id="x5mq0"><video id="x5mq0"></video></th>

      窗體皮膚實現 - 在VC中簡單實現繪制(五)

      第四部分Delphi XE3的代碼能基本完成窗體界面的繪制。窗口中的其他控件的處理方法也是相同的,截獲消息處理消息。

      問題這個編譯出來的個頭可不小。Release版本竟然2.43M,完全是個胖子。系統中應該加入了大量基礎代碼(如泛型之類),用Delphi7編譯出來應該能小一截。

      delphi版本

      使用默認Release的配置方案,沒有第三方控件。

      翻譯到C++進行測試,發現明顯這個個頭沒法比。Debug版本88.5K...~~~ 這貨確實小。

      vc版本

      C版本只實現了部分代碼(第一篇內容),并沒有全部實現。思路一樣,只是換個表示方法而已。

      最終結果演示

      代碼中處理了四個消息,還是比較簡單。只有 WM_WINDOWPOSCHANGING 消息的處理稍微長些。

      • WM_NCPAINT --- 繪制非客戶區
      • WM_NCCALCSIZE --- 重新設置邊緣寬度
      • WM_NCACTIVATE --- 程序切換時重繪非客戶去
      • WM_WINDOWPOSCHANGING --- 重設界面樣式

      連注釋和空行也就152行代碼。

      重新繪制非客戶區 WM_NCPAINT

      // 非客戶去繪制
          case WM_NCPAINT:
              GetWindowRect(hwnd, &rw);
              GetClientRect(hwnd, &rc);
              pt.x = rc.left;
              pt.y = rc.top;
              ClientToScreen(hwnd, &pt);
              OffsetRect(&rc, pt.x - rw.left, pt.y - rw.top);
      
              hdc = GetWindowDC(hwnd);
              ExcludeClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom);
      
              OffsetRect(&rw, -rw.left, -rw.top);
              // 使用這個方式比使用fillrect函數填充效果好,不閃爍
              SetBkColor(hdc, 0xBF7B18);
              ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rw, 0, 0, 0);
      
              ReleaseDC(hwnd, hdc);
              return 0;
      

      重新設置窗體邊緣寬度 WM_NCCALCSIZE

      //  設置窗體邊框寬度
          case WM_NCCALCSIZE:
              ((LPNCCALCSIZE_PARAMS)lParam)->rgrc[0].left += 3;
              ((LPNCCALCSIZE_PARAMS)lParam)->rgrc[0].top += 55;
              ((LPNCCALCSIZE_PARAMS)lParam)->rgrc[0].right -= 4;
              ((LPNCCALCSIZE_PARAMS)lParam)->rgrc[0].bottom -= 4;
              break;
      

      切換程序時重繪非客戶去WM_NCACTIVATE

      case WM_NCACTIVATE:
          PostMessage(hWnd, WM_NCPAINT, 1, 0);  // 通知刷新非客戶區
          break;
      

      設置窗體樣式 WM_WINDOWPOSCHANGING

      // 有修改窗體尺寸時重設樣式
      //
          case WM_WINDOWPOSCHANGING:
              bChanged = FALSE;
      
              // 窗體位置發生改變,重新計算繪制樣式
              if (!bChangeSizeCalled) {
                  bChanged = (((LPWINDOWPOS)lParam)->flags & SWP_FRAMECHANGED);
      
                  if ((((LPWINDOWPOS)lParam)->flags & SWP_NOMOVE) == 0) {
                      rWindowSize.left = ((LPWINDOWPOS)lParam)->x;
                      rWindowSize.top = ((LPWINDOWPOS)lParam)->y;
                  }
                  if ((((LPWINDOWPOS)lParam)->flags & SWP_NOSIZE) == 0) {
                      bChanged = bChanged || (((LPWINDOWPOS)lParam)->cx != rWindowSize.right) || (((LPWINDOWPOS)lParam)->cy != rWindowSize.bottom);
                      rWindowSize.right = ((LPWINDOWPOS)lParam)->cx;
                      rWindowSize.bottom = ((LPWINDOWPOS)lParam)->cy;
                  }
      
                  bChanged = bChanged && ((rWindowSize.right * rWindowSize.bottom) != 0);
      
                  if (bChanged) {
                      bChangeSizeCalled = TRUE;
                      __try {
                          hTmp = hRegion;
                          hRegion = CreateRoundRectRgn(0, 0, rWindowSize.right, rWindowSize.bottom, 3, 3);
                          SetWindowRgn(hwnd, hRegion, TRUE);
                          if (hTmp)
                              DeleteObject(hTmp);
                      } __finally {
                          bChangeSizeCalled = FALSE;
                      }
                  }
              }
      
              if (!bChanged)
                  return DefWindowProc(hwnd, message, wParam, lParam);
      
              return 0;
      

      開發環境:

      • VS2015 社區版
      • Win7

      完整源代碼:

      亚洲成A∨人片在线观看无码
    3. <table id="x5mq0"><track id="x5mq0"></track></table>
    4. <code id="x5mq0"><nobr id="x5mq0"><sub id="x5mq0"></sub></nobr></code>

        <pre id="x5mq0"><small id="x5mq0"><p id="x5mq0"></p></small></pre>
      1. <pre id="x5mq0"><small id="x5mq0"><track id="x5mq0"></track></small></pre>

      2. <th id="x5mq0"><video id="x5mq0"></video></th>