|
|
大家好,我刚开始学习WINDOWS编程,刚接触到BitBlt函数,可是利用该函数绘制了一个滚动屏幕,但是滚动的不流畅,而且闪烁很厉害,我想问下该如何消除BitBlt函数的闪烁情况,如何实现双缓冲。以下是我自己写的代码,写上了注释,这是什么原因?
#include <windows.h>
#include <tchar.h>
#include "resource.h"
float y = 0; // 背景图片的Y坐标
/*
函数类型: windows消息处理函数
函数功能: 处理 WM_PAINT消息:对屏幕进行位图绘制
WM_DESTROY消息:在window退出时,销毁所有使用内存
*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps; // 声明绘图PAINTSTRUCT结构
HDC hdc; // 获得当前设备环境
HDC hdcMem; // 声明内存中的设备环境
HBITMAP hbmp; // 声明位图句柄
BITMAP bmp; // 声明位图图像
// 消息处理
switch(msg) {
// WM_PAINT消息处理
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
hbmp = (HBITMAP)LoadImage(NULL, "back.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(hbmp, sizeof(BITMAP), &bmp);
SelectObject(hdcMem, hbmp);
BitBlt(hdc, 0, y, bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
// WM_DESTROY消息处理
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
/*
函数类型: WinMain主函数程序入口
函数功能: 1.窗体的创建
2.菜单的加载
3.消息的监听
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lCmdLine, int nCmdShow) {
// 声明一个窗体
WNDCLASSEX wcex;
// 设置窗体消息
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.hIcon = NULL;
wcex.hIconSm = NULL;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.lpszClassName = "sunhuiwei";
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
// 注册窗体
RegisterClassEx(&wcex);
// 创建窗体句柄
HWND hWnd = CreateWindowEx(0, "sunhuiwei", "孙惠伟", WS_OVERLAPPEDWINDOW, 200, 200, 1280, 720, HWND_DESKTOP, NULL, hInstance, NULL);
if(!hWnd) {
return FALSE;
}
// 显示和更新窗体
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 声明一个消息
MSG msg;
// 对消息进行循环监听
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
if(y > 600) {
y = 0;
}
else {
y += 2;
}
InvalidateRect(hWnd, NULL, true);
Sleep(75);
}
return msg.wParam;
} |
|