收录日期:2021/01/22 01:59:16 时间:2016/07/12 06:44:08 标签:基础类

#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 ("LineDemo_jackvs") ;
     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_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; //白色背景
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
     
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("Program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("jackvs's LineDemo"),
                          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 ;
}

int CxClient,CyClient;
int schemaX,schemaY;

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

HDC hdc;
RECT rect;

     switch (message)
     {
 
     case WM_SIZE:
 CxClient = LOWORD(lParam);
 CyClient = HIWORD(lParam);
         return 0 ;

     case WM_PAINT:
 //method two:
 hdc = GetDC(hwnd);
 Rectangle(hdc,max(10,10-schemaX),max(10,10-schemaY),max(90,100-schemaX),max(90,100-schemaY));
//画一条对角线
 MoveToEx(hdc,0,0,NULL);
 LineTo(hdc,CxClient,CyClient);
 ReleaseDC(hwnd,hdc);
          return 0 ;

 case WM_KEYDOWN:
 GetClientRect(hwnd,&rect); 
 
 switch (wParam)
 {
 case VK_UP:
 schemaY++;
 break;
 case VK_DOWN:
 schemaY--;
 break;
 case VK_LEFT:
 schemaX++;
 break;
 case VK_RIGHT:
 schemaX--;
 break;
 }
 InvalidateRect(hwnd,&rect,TRUE);
 UpdateWindow(hwnd);
 return 0;
 
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

//在矩形和线条的相交处总要闪烁,请大家帮忙一起解决下
矩形和线条的相交处,因为不断刷新。
HBITMAP hOldImageBMP;
HBITMAP hImageBMP = CreateCompatibleBitmap(hdc, CxClient, CyClient); // 创建兼容位图
HDC hImageDC = CreateCompatibleDC(hdc);//
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);

Rectangle(hImageDC ,max(10,10-schemaX),max(10,10-schemaY),max(90,100-schemaX),max(90,100-schemaY)); 
//画一条对角线 
MoveToEx(hImageDC ,0,0,NULL); 
LineTo(hImageDC ,CxClient,CyClient); 

BitBlt(hdch, 0, 0, CxClient, CyClient, ImageDC, 0, 0, SRCCOPY);

DeleteDC(hImageDC);
DeleteObject(hImageBMP);

ReleaseDC(hwnd,hdc); 

大致上是这个样子。
PAINTSTRUCT ps;

case WM_PAINT: 

  hdc = BeginPaint(hwnd, &ps);

  Rectangle(hdc,max(10,10-schemaX),max(10,10-schemaY),max(90,100-schemaX),max(90,100-schemaY)); 
  //画一条对角线 
  MoveToEx(hdc,0,0,NULL); 
  LineTo(hdc,CxClient,CyClient); 

  EndPaint(hwnd, &ps);

   return 0 ; 

GetDc() RealeaseDc() 换成 BeginPaint () EndPaint () 就不闪了!
搜索一下双缓冲绘图,应该可以解决。
引用 5 楼 zhourenyun 的回复:
搜索一下双缓冲绘图,应该可以解决。


一个矩形一条线,没必要双缓冲吧!呵呵~~~~
参考下面的方式,使用的双缓冲:

CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, width, height);
memDC.SelectObject(&capBmp);
memDC.BitBlt(0, 0, width, height, &dc, 0, 0, SRCCOPY);

//drawGraphics(&memDC);//使用这个函数画图

dc.BitBlt(0, 0, width, height, &memDC, 0, 0, SRCCOPY);
BeginPaint () EndPaint () 

这才是关键。  
其实不用getdc了~~wm_paint消息里面已经有这个Dc了 ~~

直接取出来用就可以了,但是开始画之前一定要先 BeginPaint()
不然你那些画的东西又会使这些区域无效,又会触发新的wm_paint消息。


那些闪烁就是不停画的原因。
呵呵,闪倒是不闪了,可线条没了

关于指针变量在内存中所在的长度 怎么取消新建对话框的默认确定和取消键? 关于部署水晶报表10出现的问题,郁闷啊,帮忙解决一下吧,谢谢大家了 没有看书,软设40/52 ,不知道江苏的分数线,估计是45/45吧,下一次恶补理论知识应该能过了吧 广东惠州西门子搞java开发怎么样? 都有分. Cannot start Java debug process VM(jbuilder 9.0) 请教各位高手,如何把网页上的显示的符合条件的表单倒出为dbf格式 关于INTRWEB的问题 菜鸟问题 大家有什么好的建议? 写浮点运算仿真库的书如何? 求教JS文件不能支持中文的问题 来看看吧! 急!! LINUX下用C如何使字符串转化成对应的ASCII码 请教ShowMessageFmt的用法 这个网站有点意思 如何可以删除程序自己~~~~ 征短篇笑话,散分200 如何在.net通过代码来给xml指定schema,急,请大家帮忙 在sqlserver2000里,怎么样把已有的登录帐号与已有的用户相关联? windows 2003与windows 2003 r2版有什么不同 ajax到底能不能用vb.net来开发 从今起准备混这里,我还是菜鸟,希望大家多多指点 关于线形表插入删除的效率 散分,征求想法 正确的SQL语句,放在VC中,从DB2数据库中选出数据,但CMyRecordSet类的列数据成员中却没有值! 汇编里对键盘状态的控制 请教高手,在线等 CS结构外网数据连接???急......(在线等待...) 用DATALIST控件绑定数据时,如何对数据进行一定的计算?