源码

 #include<Windows.h>
#include<tchar.h>
#include<stdio.h>
#define NUM 1000 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow)
{
WNDCLASS WndClass;
TCHAR* ClassName = TEXT("MyClass");
HWND hwnd;
MSG msg;
HBRUSH hBrush; hBrush = CreateSolidBrush(RGB(0x20, 0x85, 0x41));
WndClass.cbClsExtra = ;
WndClass.cbWndExtra = ;
WndClass.hbrBackground = hBrush;
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInst;
WndClass.lpfnWndProc = WindProc;
WndClass.lpszClassName = ClassName;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_VREDRAW | CS_HREDRAW; if (!RegisterClass(&WndClass))
{
MessageBox(NULL, TEXT("Gegister Class Fail!!"), TEXT("error"), MB_OK);
return ;
} //WS_VSCROLL窗口滚动条
hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW | WS_VSCROLL, , , , , NULL, NULL, hInst, NULL);
if (hwnd == NULL)
{
MessageBox(NULL, TEXT("Create Window Fail!!"), TEXT("error"), MB_OK);
return ;
}
ShowWindow(hwnd, nShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return ;
} LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
static HPEN hPen1,hPen2;
static HBRUSH hBrush;
PAINTSTRUCT pt;
TEXTMETRIC ts;
TCHAR buf[];
int i; //行数
static int cyChar; //字体大小
static int cy; //客户区高度
static SCROLLINFO si;
static int position = ;
switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
hBrush = CreateSolidBrush(RGB(, , ));
hPen1 = CreatePen(PS_SOLID,, RGB(, , ));
GetTextMetrics(hdc, &ts);
ReleaseDC(hwnd, hdc);
cyChar = ts.tmHeight;
si.cbSize = sizeof(si);
return ;
case WM_SIZE:
//窗口高度
cy = HIWORD(lParam);
si.fMask = SIF_ALL;
si.nMax = NUM - ;
si.nMin = ;
si.nPage = cy / cyChar;
si.nPos = position;
si.nTrackPos = ;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
case WM_VSCROLL:
//当滚动条是窗口的一部分时,可以忽略IParam参数
switch (LOWORD(wParam))
{
case SB_BOTTOM:
si.nPos = si.nMax;
break;
case SB_LINEDOWN:
si.nPos++;
break;
case SB_LINEUP:
si.nPos--;
break;
case SB_PAGEDOWN:
si.nPos = si.nPos + cy / cyChar;
break;
case SB_PAGEUP:
si.nPos = si.nPos - cy / cyChar;
break;
case SB_THUMBPOSITION:
si.nPos = HIWORD(wParam);
break;
default:
break;
}
si.fMask = SIF_POS;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
GetScrollBarInfo(hwnd, SB_VERT, &si);
position = si.nPos;
//UpdateWindow(hwnd);//窗口必须有无效区,否则刷新也是白刷。替换为InvalidateRect强制刷新
//InvalidateRect函数会产生WM_PAINT消息
InvalidateRect(hwnd, NULL, FALSE);
return ;
case WM_PAINT:
GetScrollBarInfo(hwnd, SB_VERT, &si);
//调用BeginPaint后整个客户去都是有效的。ValidateRect使客户区中任意矩形区域变成有效的
hdc = BeginPaint(hwnd, &pt);
hPen2=(HPEN)SelectObject(hdc, hPen1);
SelectObject(hdc, hBrush);
MoveToEx(hdc, , , NULL);
LineTo(hdc, , );
Rectangle(hdc, , , , );
SelectObject(hdc, hPen2); for (i = ; i < NUM; i++)
{
_stprintf(buf, TEXT("---------------%d--------------"), si.nPos + i);
TextOut(hdc, , i * cyChar, buf, _tcslen(buf));
}
EndPaint(hwnd, &pt);
return ;
case WM_DESTROY:
PostQuitMessage();//发送WM_QUIT消息
return ;
default:
break;
} return DefWindowProc(hwnd, message, wParam, lParam);
}

创建画刷

HBRUSH CreateSolidBrush(
COLORREF color
);

初始化一个指定颜色的画刷。画笔可以随后被选为任何设备上下文的当前刷子。

SelectObject 

HGDIOBJ SelectObject(
HDC hdc,
HGDIOBJ h
);

把一个对象(位图、画笔、画刷等)选入指定的设备描述表。新的对象代替同一类型的老对象。

hdc :设备描述表句柄(要载入的设备描述表句柄)

h: 选择要载入的对象的句柄

但该对象的句柄必须使用以下函数创建才有效:

Bitmap(位图)          CreateBitmap, CreateBitmapIndirect, 
                               CreateCompatibleBitmap, CreateDIBitmap, 
                               CreateDIBSection 
Brush(画刷)            CreateBrushIndirect, eateDIBPatternBrush,  
                               CreateDIBPatternBrushPt, CreateHatchBrush,  
                               CreatePatternBrush, CreateSolidBrush 
Font(字体)              CreateFont, CreateFontIndirect

Pen(画笔)               CreatePen, CreatePenIndirect

Region(区域)          CombineRgn, CreateEllipticRgn,  
                               CreateEllipticRgnIndirect,  
                               CreatePolygonRgn, CreateRectRgn,  
                               CreateRectRgnIndirect

返回值:如果选择对象不是区域并且函数执行成功,那么返回值是被取代的对象的句柄;如果选择对象是区域并且函数执行成功,返回如下一值;
设置当前的背景色
COLORREF SetBkColor(
HDC hdc,
COLORREF color
);

用指定的颜色值来设置当前的背景色,如果指定的颜色值超出了当前设备的表示范围,则设置为最近似的、设备可以表示的颜色。

hdc:设置上下文句柄
color:标识新的背景颜色值。如果想要获得COLORREF的值,请使用RGB宏。
MoveToEx 
BOOL MoveToEx(
HDC hdc,
int x,
int y,
LPPOINT lppt
);

将当前绘图位置移动到某个具体的点,同时也可获得之前位置的坐标。

hdc:  传入参数,设备上下文句柄。
x:      传入参数:新位置的X坐标。
y:   传入参数:新位置的Y坐标。
 lppt:   传出参数:一个指向POINT结构的指针,用来存放上一个点的位置,若此参数为NULL,则不保存上一个点的位置
返回值:  返回TRUE代表移动成功,FALSE代表失败
LineTo 
BOOL LineTo(
HDC hdc,
int x,
int y
);

用当前画笔画一条线,从当前位置连到一个指定的点。这个函数调用完毕,当前位置变成x,y。

hdc:  设备句柄
x:   线段终点X坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部份
y:   线段终点Y坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部份
返回值:返回TRUE代表移动成功,FALSE代表失败

08 Windows编程——画图的更多相关文章

  1. 【Windows编程】系列第六篇:创建Toolbar与Statusbar

    上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...

  2. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  3. MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)

    为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一.      白话经典算法 目前有17篇,分为七大排序和经典面试题 ...

  4. 走进windows编程的世界-----入门篇

    1   Windows编程基础 1.1Win32应用程序基本类型 1)  控制台程序 不须要完好的windows窗体,能够使用DOS窗体方式显示 2)  Win32窗体程序 包括窗体的程序,能够通过窗 ...

  5. 【Windows编程】系列第十一篇:多文档界面框架

    前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典 ...

  6. 【Windows编程】系列第十篇:文本插入符

    大家知道,在使用微软的编程环境创建工程时会让你选择是控制台模式还是Windows应用程序.如果选择控制台的console模式,就会在运行时出现一个黑洞洞的字符模式窗口,里面就有等待输入一闪一闪的插入符 ...

  7. 【Windows编程】系列第八篇:通用对话框

    上一篇我们学习了菜单的基本编程,本篇来了解一下通用对话框的使用.Windows系统之所以是目前最流行的桌面系统,也是因为Windows有一套标准化,统一友好的交互界面,比如菜单.工具栏.状态栏以及各个 ...

  8. 【Windows编程】系列第七篇:Menubar的创建和使用

    上一篇我们学习了利用windows API创建工具栏和菜单栏,与上一篇紧密联系的就是菜单栏,菜单栏是一个大多数复杂一些的Windows应用程序不可或缺的部分.比如下图就是Windows自带的记事本的菜 ...

  9. 【Windows编程】系列第九篇:剪贴板使用

    上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...

随机推荐

  1. linux 安装网易云音乐

    1.首先去官网下载最新的网易云 网易云音乐曾经推出官方Linux版本,提供的下载安装包有:deepin15(32位):http://s1.music.126.net/download/pc/net . ...

  2. 使用PHP实现命令模式(转)

    <?php /** * 命令模式 2010-08-21 sz * @author phppan.p#gmail.com http://www.phppan.com * 哥学社成员(http:// ...

  3. 关于cookies、sessionStorage和localStorage解释及区别

    在浏览器查看 HTML4的本地存储 cookie 浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和sessio ...

  4. service 方法和doGet、doPost方法的区别

    Service方法和doGet和doPost方法的区别service:     可以处理get/post方式的请求,如果servlet 中有service方法,会优先调用service方法进行处理do ...

  5. Fiddler之基础:面板、图标介绍

    1.面板介绍:菜单栏,工具栏,回话面板,监控面板 2.工具栏-图标 3.会话面板-图标 4.监控面板 5.状态栏 控制台Fiddler的左下角有一个命令行工具叫做QuickExec,允许你直接输入命令 ...

  6. Jmeter plugins 之 Perfmon Metrics Collector(服务器性能监控)

    客户端(Jmeter端) 1.安装plugins manager,然后安装  2.添加listener-(第1步成功后才可看到此功能)  服务端:(要监控的服务器) 1.下载ServerAgent,并 ...

  7. Ribbon【入门】

    公共依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>sprin ...

  8. SASS摘要

    SASS提高了代码的重复利用率,提高了效率.不用去记或者查找复杂或者繁琐的参数和书写规则. 这里简单整理了实际业务中常常用到的几个功能. 1. 父元素引用 & a { &:hover ...

  9. PAT(B) 1021 个位数统计(Java)

    题目链接:1021 个位数统计 (15 point(s)) 代码 /** * Score 15 * Run Time 93ms * @author wowpH * @version 1.0 */ im ...

  10. 【BFS】斗地主

    斗地主 题目描述 众所周知,小 X 是一个身材极好.英俊潇洒.十分贪玩成绩却依然很好的奆老.这不,他又找了他的几个好基友去他家里玩斗地主了……身为奆老的小 X 一向认为身边人和自己一样的厉害,他坚信你 ...