08 Windows编程——画图
源码
#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
);
用指定的颜色值来设置当前的背景色,如果指定的颜色值超出了当前设备的表示范围,则设置为最近似的、设备可以表示的颜色。
BOOL MoveToEx(
HDC hdc,
int x,
int y,
LPPOINT lppt
);
将当前绘图位置移动到某个具体的点,同时也可获得之前位置的坐标。
BOOL LineTo(
HDC hdc,
int x,
int y
);
用当前画笔画一条线,从当前位置连到一个指定的点。这个函数调用完毕,当前位置变成x,y。
08 Windows编程——画图的更多相关文章
- 【Windows编程】系列第六篇:创建Toolbar与Statusbar
上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)
为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题 ...
- 走进windows编程的世界-----入门篇
1 Windows编程基础 1.1Win32应用程序基本类型 1) 控制台程序 不须要完好的windows窗体,能够使用DOS窗体方式显示 2) Win32窗体程序 包括窗体的程序,能够通过窗 ...
- 【Windows编程】系列第十一篇:多文档界面框架
前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典 ...
- 【Windows编程】系列第十篇:文本插入符
大家知道,在使用微软的编程环境创建工程时会让你选择是控制台模式还是Windows应用程序.如果选择控制台的console模式,就会在运行时出现一个黑洞洞的字符模式窗口,里面就有等待输入一闪一闪的插入符 ...
- 【Windows编程】系列第八篇:通用对话框
上一篇我们学习了菜单的基本编程,本篇来了解一下通用对话框的使用.Windows系统之所以是目前最流行的桌面系统,也是因为Windows有一套标准化,统一友好的交互界面,比如菜单.工具栏.状态栏以及各个 ...
- 【Windows编程】系列第七篇:Menubar的创建和使用
上一篇我们学习了利用windows API创建工具栏和菜单栏,与上一篇紧密联系的就是菜单栏,菜单栏是一个大多数复杂一些的Windows应用程序不可或缺的部分.比如下图就是Windows自带的记事本的菜 ...
- 【Windows编程】系列第九篇:剪贴板使用
上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...
随机推荐
- iOS-ASI异步下载图片
异步下载图片 异步下载图片ASIHTTPRequest *requestX = [ASIHTTPRequest requestWithURL:url]; self.re ...
- sonar:api/ce/submit接口上传失败
https://blog.csdn.net/weixin_34185320/article/details/87115268 https://ask.helplib.com/others/post_1 ...
- Kingbase数据库web统一管理平台
1.安装Kingbase金仓数据库后,通过打开web管理平台,可以方便的进行远程维护. 示例地址:https://192.168.0.1:54328/webstudio 2.输入用户名密码登 ...
- .Net Core 请求上下文IHttpContextAccessor
namespace Microsoft.AspNetCore.Http { public interface IHttpContextAccessor { HttpContext HttpContex ...
- electron node.js 在 vscode 设置 调试 Debug
在当前工程下,添加一个 .vscode/launch.json 文件 { // Use IntelliSense to learn about possible attributes. // Hove ...
- postman带Token测试接口
首先打开postman.是这样的界面 我们的需求是这样的.实现登录之后返回token.然后请求其他接口时在header头中带上token信息. OK.接下来我们这样操作: 现在登录没有操作token. ...
- 《Mysql - 我的Mysql为什么会抖一下?》
一: 抖一下? - 平时的工作中,不知道有没有遇到过这样的场景. - 一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢. - 并且这样的场景很难复现,它不只随机,而 ...
- C++实现16进制字符串转换成int整形值
开发中经常需要把16进制字符串转换成整形,写了个个代码供大家参考下: #include <stdio.h> #include <string.h> //字符转换成整形 int ...
- PAT甲级 图 相关题_C++题解
图 PAT (Advanced Level) Practice 用到图的存储方式,但没有用到图的算法的题目 目录 1122 Hamiltonian Cycle (25) 1126 Eulerian P ...
- python实现文件搜索工具(简易版)
在python学习过程中有一次需要进行GUI 的绘制, 而在python中有自带的库tkinter可以用来简单的GUI编写,于是转而学习tkinter库的使用. 学以致用,现在试着编写一个简单的磁文件 ...