API 占CPU 资源问题

sunlau29 2007-11-29 10:03:41
最近开始学习Windows API 编程。写了一个很简单的API,就是在WinProc 里面用 WM_PAINT 在窗口上显示一副小图片,但是这个窗口一打开CPU占用率 就高达90%。请问各位API高手,应该怎么去改进? 如果可以,请告诉我直接的方法,不要叫我去翻《windows程序设计》。
...全文
125 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunlau29 2007-12-04
  • 打赏
  • 举报
回复
谢谢你,12楼,但是我把你的程序直接建立一个新工程运行,报错了
Compiling...
main.cpp
E:\MyGames\ES1\main.cpp(47) : error C2065: 'brvbarCS_VREDRAW' : undeclared identifier
Error executing cl.exe.

ES1.exe - 1 error(s), 0 warning(s)
feng1976 2007-12-04
  • 打赏
  • 举报
回复
不客气
对给我发几分,哈哈
sunlau29 2007-12-04
  • 打赏
  • 举报
回复
谢谢9楼,你的方法最好,把我的绘图代码放到beiginPaint 和EndPain之间,资源问题就解决了,谢谢
ZiSheng 2007-12-02
  • 打赏
  • 举报
回复
to6,7楼;
不愿回答问题就请不要说没用的话
ZiSheng 2007-12-02
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <windows.h>



HBITMAP hBitmap;
extern HINSTANCE hInst;
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance;

hWnd = CreateWindow("MYBMPDIAG",
"BMPDIAG",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
800,
800, //标题栏高三十
NULL,
NULL,
hInstance,
NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "MYBMPDIAG";
wcex.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

return RegisterClassEx(&wcex);

}

HINSTANCE hInst;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

MSG msg;


//HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,"BMP/u1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE |LR_CREATEDIBSECTION);

MyRegisterClass(hInstance);


if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}


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

return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;

HDC hdcmem;
RECT rect2;
GetClientRect(hWnd,&rect2);
static int nBmpX,nBmpY;

static HBITMAP hBitmap;
BITMAP bmp;
PAINTSTRUCT ps;
HINSTANCE hInstance;
int result;
switch (message)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
hBitmap=(HBITMAP)::LoadImage(hInstance,"BMP/19.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

result =GetObject(hBitmap,sizeof(bmp),&bmp);
nBmpX=bmp.bmWidth;
nBmpY=bmp.bmHeight;
return 0;
case WM_PAINT:

hdc=BeginPaint(hWnd,&ps);
hdcmem=CreateCompatibleDC(hdc);
SelectObject(hdcmem,hBitmap);
// mydc=GetDC(hWnd);
// RECT rect2;
// GetClientRect(hWnd,&rect2);
BitBlt(hdc,0,0,nBmpX,nBmpY,hdcmem,0,0,SRCCOPY);
DeleteDC(hdcmem);
// ReleaseDC(hWnd,mydc);
// ReleaseDC(hWnd,hdc);
EndPaint(hWnd,&ps);
return 0;



case WM_CLOSE:
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
}

return DefWindowProc(hWnd, message, wParam, lParam);



}
以上程序在我的机器上运行成功
ZiSheng 2007-12-02
  • 打赏
  • 举报
回复
wcex.hbrBackground = NULL;//(HBRUSH)(COLOR_WINDOW+1);
这里是主要的问题所在
feng1976 2007-12-01
  • 打赏
  • 举报
回复
绘制部分要这样写

LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 0, 0, "Hello, Windows!", 15);
EndPaint(hwnd, &ps);
return 0L;

// Process other messages.
}
}
sunlau29 2007-12-01
  • 打赏
  • 举报
回复
如果要正确实现我需要的效果,那应该如何写?
feng1976 2007-11-30
  • 打赏
  • 举报
回复
^_^
只知其然,不知其所以然啊
jameshooo 2007-11-30
  • 打赏
  • 举报
回复
天哪,LoadImage会被调用无数次。
WM_PAINT消息处理过程比较乱。
DC用得不正确。

总之,问题不打一处来。
sunlau29 2007-11-30
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <windows.h>

extern HINSTANCE hInst;
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance;

hWnd = CreateWindow("MYBMPDIAG",
"BMPDIAG",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
300,
200+30, //标题栏高三十
NULL,
NULL,
hInstance,
NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW| CS_OWNDC;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = NULL;//(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "MYBMPDIAG";
wcex.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

return RegisterClassEx(&wcex);

}

HINSTANCE hInst;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

MSG msg;


MyRegisterClass(hInstance);


if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}


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

return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;

HDC mydc;
RECT rect2;
GetClientRect(hWnd,&rect2);
int nBmpX;
int nBmpY;
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,"BMP/U1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
BITMAP bmp;


switch (message)
{
case WM_COMMAND:

break;


case WM_PAINT:
{
GetObject(hBitmap,sizeof(bmp),&bmp);
nBmpX=bmp.bmWidth;
nBmpY=bmp.bmHeight;
hdc=CreateCompatibleDC(NULL);
SelectObject(hdc,hBitmap);
mydc=GetDC(hWnd);
StretchBlt(mydc,0,0,rect2.right,rect2.bottom,hdc,0,0,nBmpX,nBmpY,SRCCOPY);
ReleaseDC(hWnd,mydc);
break;
}


case WM_CLOSE:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
stivenjia 2007-11-30
  • 打赏
  • 举报
回复
你连个代码都不告诉我,我怎么能知道为什么能占如此多的资源
jameshooo 2007-11-30
  • 打赏
  • 举报
回复
贴代码上来看看
Pipi0714 2007-11-30
  • 打赏
  • 举报
回复
看不到代码如何改?
zaodt 2007-11-30
  • 打赏
  • 举报
回复
看不到,怎么改?

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧