标题:简单窗口绘图程序刷新问题
只看楼主
heavystorm
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-2-12
结帖率:0
已结贴  问题点数:10 回复次数:2 
简单窗口绘图程序刷新问题
请看下面的Windows简易绘图程序一部分:
draw()是绘图函数
     我在消息处理中加入case WM_LBUTTONDOWN:当按下鼠标左键时,应该执行它之下的语句,我发现number++执行了,但draw()似乎没执行,因为如果执行了draw()我应该看到图形的变化,draw()函数前面有绘制一个大的白色正方形,作用类似清屏。如果我拽着程序窗口到边界,让窗口大部分到达显示器边界外,然后拽回来则发现图形变了。按我的理解,应该按下鼠标键图形就变化,可为什么没变化呢?如果想按下鼠标键就让图形变化应该怎么编程呢?怎么刷新窗口呢?期待专家解答!

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)//窗口函数说明
{
    switch(message)//处理消息
    {
    case WM_LBUTTONDOWN:
        number+=10;
        draw();
        break;
    case WM_RBUTTONDOWN:
        number-=10;
        draw();
        break;
    case WM_PAINT://处理绘图消息
        draw();
        break;
    case WM_DESTROY://消除窗口时由DestroyWindow函数发出此消息
        PostQuitMessage(0);//向应用程序发出WM_QUIT消息,请求退出
        break;
    default://对未定义的消息提供默认处理
        return(DefWindowProc(hwnd,message,wParam,lParam));
        //DefWindowProc是系统默认的处理过程
    }return 0;
}
void draw()
{
    HDC hDC;//定义指向设备上下文的句柄
    HBRUSH hb1,hb2;//定义指向画刷的句柄
    PAINTSTRUCT PtStr;//定义指向包含绘图信息的结构体变量
    HPEN hPen;//定义指向画笔的句柄
        hDC=BeginPaint(hwnd,&PtStr);
        SetMapMode(hDC,nMode);//设置映射模式

        hPen=(HPEN)GetStockObject(WHITE_PEN);//设置画笔为系统预定义的白色画笔
        hb1=(HBRUSH)GetStockObject(WHITE_BRUSH);//白色画刷
        SelectObject(hDC,hb1);//选择画刷
        SelectObject(hDC,hPen);//选择画笔
        Rectangle(hDC,0,0,1000,1000);

        hPen=(HPEN)GetStockObject(BLACK_PEN);//设置画笔为系统预定义的黑色画笔
        hb1=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//深灰色画刷
        SelectObject(hDC,hb1);//选择画刷
        SelectObject(hDC,hPen);//选择画笔
        RoundRect(hDC,9,120,number,200,15,15);//圆角矩形
        hb2=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//淡灰色画刷
        SelectObject(hDC,hb2);//选择画刷
        Ellipse(hDC,150,50,200,150);//椭圆
        hb1=(HBRUSH)GetStockObject(HOLLOW_BRUSH);//采用系统预定义的虚画刷
        SelectObject(hDC,hb1);//选择画刷
        Pie(hDC,250,50,300,100,250,50,300,50);//饼形

        EndPaint(hwnd,&PtStr);//结束绘图
}



该程序的全部源程序:
#include<windows.h>//包含基本数据类型定义
#include<stdlib.h> //数学函数库
#include<string.h> //数学函数库
#include<stdio.h>//输入输出库
int nMode;
int number=0;
void draw();
HWND hwnd;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数说明
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) // 入口函数
{
    MSG Msg; //MSG为消息结构体变量类型  Message为变量名,可为Msg
    WNDCLASS wndclass;
    char lpszClassName[]="映射模式";
    char lpszTitle[]="LTL Programe";
    wndclass.style=0;
    wndclass.lpfnWndProc=WndProc;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hInstance=hInstance;
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName=NULL;
    wndclass.lpszClassName=lpszClassName;
    if(!RegisterClass(&wndclass))
    {
        MessageBeep(0);
        return FALSE;
    }
    hwnd=CreateWindow
        (
        lpszClassName,//窗口实例的标题名
        lpszTitle,//窗口的风格
        WS_OVERLAPPEDWINDOW,//
        CW_USEDEFAULT,//窗口左上角坐标为默认值
        CW_USEDEFAULT,//
        CW_USEDEFAULT,//窗口的高和宽为默认值
        CW_USEDEFAULT,
        NULL,//此窗口无父窗口
        NULL,//此窗口无主菜单
        hInstance,//创建此窗口应用程序的当前句柄
        NULL//不使用该值
        );
    ShowWindow(hwnd,nCmdShow);//显示窗口
    UpdateWindow(hwnd);//绘制用户区
        while(GetMessage(&Msg,0,0,0))//消息循环
                                 //后两个参数为0不过滤消息
        {//GetMessage是从消息队列中提取一条消息,并将消息放到MSG结构体
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)//窗口函数说明
{
    switch(message)//处理消息
    {
    case WM_LBUTTONDOWN:
        number+=10;
        draw();
        break;
    case WM_RBUTTONDOWN:
        number-=10;
        draw();
        break;
    case WM_PAINT://处理绘图消息
        draw();
        break;
    case WM_DESTROY://消除窗口时由DestroyWindow函数发出此消息
        PostQuitMessage(0);//向应用程序发出WM_QUIT消息,请求退出
        break;
    default://对未定义的消息提供默认处理
        return(DefWindowProc(hwnd,message,wParam,lParam));
        //DefWindowProc是系统默认的处理过程
    }return 0;
}
void draw()
{
    HDC hDC;//定义指向设备上下文的句柄
    HBRUSH hb1,hb2;//定义指向画刷的句柄
    PAINTSTRUCT PtStr;//定义指向包含绘图信息的结构体变量
    HPEN hPen;//定义指向画笔的句柄
        hDC=BeginPaint(hwnd,&PtStr);
        SetMapMode(hDC,nMode);//设置映射模式

        hPen=(HPEN)GetStockObject(WHITE_PEN);//设置画笔为系统预定义的白色画笔
        hb1=(HBRUSH)GetStockObject(WHITE_BRUSH);//白色画刷
        SelectObject(hDC,hb1);//选择画刷
        SelectObject(hDC,hPen);//选择画笔
        Rectangle(hDC,0,0,1000,1000);

        hPen=(HPEN)GetStockObject(BLACK_PEN);//设置画笔为系统预定义的黑色画笔
        hb1=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//深灰色画刷
        SelectObject(hDC,hb1);//选择画刷
        SelectObject(hDC,hPen);//选择画笔
        RoundRect(hDC,9,120,number,200,15,15);//圆角矩形
        hb2=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//淡灰色画刷
        SelectObject(hDC,hb2);//选择画刷
        Ellipse(hDC,150,50,200,150);//椭圆
        hb1=(HBRUSH)GetStockObject(HOLLOW_BRUSH);//采用系统预定义的虚画刷
        SelectObject(hDC,hb1);//选择画刷
        Pie(hDC,250,50,300,100,250,50,300,50);//饼形

        EndPaint(hwnd,&PtStr);//结束绘图
}
搜索更多相关主题的帖子: Windows 显示器 正方形 
2011-02-13 15:18
BlueSKySea
Rank: 2
等 级:论坛游民
帖 子:2
专家分:20
注 册:2011-2-8
得分:10 
不需要加draw()函数,启动WM_PAINT消息就行了吧,
2011-02-13 23:46
歌坛青蛙
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-7-3
得分:0 
BeginPaint/EndPaint函数刷新的是无效区域.用GetDC/ReleaseDC函数,刷新整个用户区域.
2013-07-03 09:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-332145-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013715 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved