hur.cn - 华软网

 热门搜索

一个简单的显示问题,关于显示图标的。

  作者:未知    来源:网络    更新时间:2011/1/16
C++">#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName [] = TEXT ("BitBlt") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_INFORMATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
     
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("BitBlt Demo"), 
                          WS_OVERLAPPEDWINDOW, 
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;

     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static int  cxClient, cyClient, cxSource, cySource ;
     HDC         hdcClient, hdcWindow ;
     int         x, y ;
     PAINTSTRUCT ps ;
     static int cx,cy;
     switch (message)
     {
     case WM_CREATE:
          cxSource = GetSystemMetrics (SM_CXSIZEFRAME) +
                     GetSystemMetrics (SM_CXSIZE) ;//获得一个题目栏上图标的宽度(象素)+边框

         cySource = GetSystemMetrics (SM_CYSIZEFRAME) + 
                     GetSystemMetrics (SM_CYCAPTION) ;//获得题目栏的高度+边框
 cx=GetSystemMetrics(SM_CXSCREEN)-29;//这里减去29就恰好使起头位置酿成了右上角那个差号的位置
 cy=0;
          return 0 ;

     case WM_SIZE:
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;
          return 0 ;

     case WM_PAINT:
          hdcClient = BeginPaint (hwnd, &ps) ;
          hdcWindow = GetWindowDC (hwnd) ;

          for (y = 0 ; y < cyClient ; y += cySource)
          for (x = 0 ; x < cxClient ; x += cxSource)
          {
               BitBlt (hdcClient, x, y, cxSource, cySource,
                       hdcWindow, cx, 0, SRCCOPY) ;
          }

          ReleaseDC (hwnd, hdcWindow) ;
          EndPaint (hwnd, &ps) ;
          return 0 ;

     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

目的是利用bitblt函数来复制右上角的那个红色差号图标放置到客户区,不知道什么原因,必需点最大化的时候才能显示出来,而刚起头运行的时候客户区空白。没看出那里有问题,3Q!
---华软 网友回答---
for (y = 0 ; y < cyClient ; y += cySource)
          for (x = 0 ; x < cxClient ; x += cxSource)
          {
               BitBlt (hdcClient, x, y, cxSource, cySource,
                       hdcWindow, cx, 0, SRCCOPY) ;
          }
==========
循环里调用BitBlt啊?一次性调用欠好吗?
---华软网友回复---
invalidateRect/updatewindow更新试试
---华软网友回复---
刚洗澡的时候找到问题了,
cx=GetSystemMetrics(SM_CXSCREEN)-29;//这里减去29就恰好使起头位置酿成了右上角那个差号的位置
         cy=0;
这里的SM_CXSCREEN是整个屏幕的象素宽度,比如我的分辨率为1280*800,则我的这个cx=1251,cy=0
也就是说复制这个矩形区域的像素到客户区
然则当程序运行的时候,其实不是最大化显示的,所以1251这个象素区还没所有东西,而最大化的时候,窗体充满了整个屏幕,因此会显示出来差号。
更改:应该获得的是当前窗体的巨细(象素)-29才能够,然则当前窗体的像素宽度不知道咋么猎取,列位有措施没,我在WM_SIZE中尝试以下:
case WM_SIZE:
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;
cx=cxClient-29;
cy=0;
          return 0 ;
这样就能显示出来了,然则cxClient人家究竟是客户区的巨细,要想获得真正的窗体宽度,需要客户区巨细+左扩展边框+右扩展边框=cwindowx=cxClient+2*GetSystemMetrics (SM_CXSIZEFRAME)这个就是了
然后cx=cwindowx-29;cy=0;如此方能获得正解。
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。