hur.cn - 华软网

 热门搜索

BitBlt问题

  作者:未知    来源:网络    更新时间:2011/4/17
case      WM_PAINT:   

hdcClient = BeginPaint (hwnd, &ps) ;
for (y = 0 ; y < cyClient ; y += cySource)
for (x = 0 ; x < cxClient ; x += cxSource)
{
BitBlt (hdcClient, x, y, cxSource, cySource,
hdcWindow, 0, 0, SRCCOPY) ;
}
ReleaseDC (hwnd, hdcWindow) ;
EndPaint (hwnd, &ps) ;

每次改变窗口尺寸 应该执行的是同一段代码 但是显示出来的图片去不一样 这个BitBlt到底是怎么工作的呀? 难道窗口创建的时候 他就将图片保存了下来当我改变窗口的位置然后改变窗口尺寸 他读取的是第一次的图片信心? 问题是运行的代码是同一段呀。。
---华软 网友回答---
参数1,2,3,4表示目的矩形的信息(也就是要拷贝到目的DC的位置),参数1,2表示目的矩形的左上角坐标,参数3,4表示目的矩形的长和宽,参数6,7表示你看源DC的矩形左上角坐标(也就是从源DC的哪个位置开始拷贝,比如(0,0),就是从左上角,(10,10),就是坐标(10,10)的意思 ).

既然你客户区坐标一直变,那根据你设置的,目的矩形一直在变化,你看是不是你的要求!
---华软网友回复---
说错了
参数3,4表示目的矩形的宽和高
---华软网友回复---
你每次都重新beginpaint吧。

---华软网友回复---
我说明下情况:

假设我窗口产生时,BitBlt函数要复制的区域中有个A然后我移动窗口让A不在那块区域中(我移动的是窗口)但是当我按住窗口左边缘缩小窗口时 那时候应该是产生WM_PAINT消息就是在次执行上一段代码,可是我发现那个A 还是被复制进去了。。。。  效果就相当于BitBlt第二次包括以后的复制都是从第一次保存的图片上进行的。。。但是当我把句柄换成整个屏幕的句柄时 每次都是重新 复制画面 代码如下  好心人帮我调试下告诉我原因好吗?困惑了我2天了
C++">#include <windows.h>   
#include "resource.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 HINSTANCE            hInstance;
//static HBITMAP              hBitmap;
//static BITMAP               bitmap; 
static int                  cxClient, cyClient, cxSource, cySource ;   
    HDC                         hdcClient, hdcWindow ;   
int                         x, y ;   
PAINTSTRUCT                 ps ;   

switch (message)   
{   
case WM_CREATE: 
hInstance=(HINSTANCE)((LPCREATESTRUCT)lParam)->hInstance;
//hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
//GetObject(hBitmap,sizeof(BITMAP),&bitmap);
cxSource = GetSystemMetrics (SM_CXSIZEFRAME) +   
GetSystemMetrics (SM_CXSIZE) ;
cySource = GetSystemMetrics (SM_CYSIZEFRAME) +   
GetSystemMetrics (SM_CYCAPTION) ;  
//cxSource=bitmap.bmWidth;
//cySource=bitmap.bmHeight;
return 0 ;   
case      WM_SIZE:   
cxClient = LOWORD (lParam) ;   
cyClient = HIWORD (lParam) ;
        
return 0 ;   

case      WM_PAINT:   
hdcWindow = GetWindowDC (hwnd) ;
hdcClient = BeginPaint (hwnd, &ps) ;
for (y = 0 ; y < cyClient ; y += cySource)
for (x = 0 ; x < cxClient ; x += cxSource)
{
BitBlt (hdcClient, x, y, cxSource, cySource,
hdcWindow, 0, 0, SRCCOPY) ;
}
ReleaseDC (hwnd, hdcWindow) ;
EndPaint (hwnd, &ps) ;
return 0 ;

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

---华软网友回复---
没看明白,你再说说看?步骤再详细点?
---华软网友回复---
你按照我的方法做:

运行代码后 窗口显示的是当前窗口左上角的图片,然后记住这块区域右边有哪些东西,接着移动窗口到别的地方, 接着拖动窗口 左边缘  向右 缩小窗口 你会发现窗口显示会发生改变,它显示的图片是原来窗口位置的右边的图片, 但是 窗口新位置的右边图片
---华软网友回复---
或者简单的帮我解释下 为甚么 拖动窗口左边那条边向右移动缩小窗口 会使图像改变,但是拖动同一条变向左边移动扩大窗口会擦掉原来的图片 变白色了。。。。。。纠结啊
---华软网友回复---
我的理解能力....LZ最后能截个效果图 看看      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。