LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static int cxClient, cyClient;
static int iMapMode;
switch (message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
//视口和窗口
//逻辑坐标系统 ->窗口(程序员编码的)
//设备坐标系统 -> 视口(眼睛看到的) //映射模式决定逻辑坐标的单位
//设备坐标的单位是像素 //在窗口下编程,在视口下显示 MoveToEx(hdc, cxClient / , , NULL);
LineTo(hdc, cxClient / , cyClient);
MoveToEx(hdc, , cyClient / , NULL);
LineTo(hdc, cxClient, cyClient / );
//获取旧的映射模式
iMapMode = GetMapMode(hdc);
//设置新的 x向右 y向上 单位 0.1mm
SetMapMode(hdc, MM_LOMETRIC);
//设置视口
SetViewportOrgEx(hdc, cxClient / , cyClient / , NULL); //新的视口原点x,新的视口原点y,以及一个point指针用于存放原来视口位置(0,0) TextOut(hdc, , , L"ViewPort", ); EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hwnd, message, wParam, lParam);
}

正弦函数练习

#define NUM 1000
#define PI 3.1415926 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static int cxClient, cyClient;
static int iMapMode;
POINT apt[];
switch (message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
//视口和窗口
//逻辑坐标系统 ->窗口(程序员编码的)
//设备坐标系统 -> 视口(眼睛看到的) //映射模式决定逻辑坐标的单位
//设备坐标的单位是像素 //在窗口下编程,在视口下显示 MoveToEx(hdc, , cyClient/, NULL);
LineTo(hdc, cxClient, cyClient/);
MoveToEx(hdc, , , NULL);
LineTo(hdc, , cyClient);
//获取旧的映射模式
iMapMode = GetMapMode(hdc);
//设置视口
SetViewportOrgEx(hdc, , cyClient / , NULL); //新的视口原点x,新的视口原点y,以及一个point指针用于存放原来视口位置(0,0) for (int i = ; i < NUM;i++)
{
apt[i].x = cxClient / NUM*i; //单位不一致,需要测试
apt[i].y = -(int)( * sin( * PI*i / NUM));
} Polyline(hdc, apt, ); EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hwnd, message, wParam, lParam);
}

坐标转换

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static int cxClient, cyClient;
static int iMapMode;
POINT apt[];
switch (message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
//视口和窗口
//逻辑坐标系统 ->窗口(程序员编码的)
//设备坐标系统 -> 视口(眼睛看到的) //映射模式决定逻辑坐标的单位
//设备坐标的单位是像素 //在窗口下编程,在视口下显示 //设备坐标转换为逻辑坐标 DPtoLP
//逻辑坐标转换为设备坐标 LPtoDP MoveToEx(hdc, , cyClient/, NULL);
LineTo(hdc, cxClient, cyClient/);
MoveToEx(hdc, , , NULL);
LineTo(hdc, , cyClient); //获取旧的映射模式
iMapMode = GetMapMode(hdc);
SetMapMode(hdc,MM_LOMETRIC); DPtoLP(hdc, &rect, ); //句柄,POINT指针,点个数 rect是两个点,矩形左上,右下 //设置视口
SetViewportOrgEx(hdc, , cyClient / , NULL); //新的视口原点x,新的视口原点y,以及一个point指针用于存放原来视口位置(0,0) for (int i = ; i < NUM;i++)
{
apt[i].x = rect.right*i / NUM; //单位不一致,需要测试
apt[i].y = (int)(rect.bottom/ * sin( * PI*i / NUM));
} Polyline(hdc, apt, ); EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hwnd, message, wParam, lParam);
}

学习windows编程 day4 之视口和窗口的更多相关文章

  1. 学习windows编程 day4 之 自定义映射

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

  2. 学习windows编程 day4 之 绘制随机矩形和peekMessage

    #include <windows.h> #include <strsafe.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT messa ...

  3. 学习windows编程 day4 之 盯裆猫

    写着写着就困了.... 看这些测量数据就算了,是对各种函数的练习 #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT ...

  4. 学习windows编程 day4 之 多边矩形填充

    #include <windows.h> #include <math.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT message, ...

  5. 学习windows编程 day4 之 映射模式

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

  6. 学习windows编程 day4 之 矩形的操作

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

  7. 学习windows编程 day4 之 设置画刷

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

  8. 有一定基础的 C++ 学习者该怎样学习 Windows 编程?

    人的心理有个奇异的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解非常快就会忘得干干净净,似乎一切都是自然而然,本来就该这种.因此,关于「怎样入门」这类问题,找顶尖高手来回答,未必能比一个刚入门 ...

  9. 我为什么学习Windows编程

    前一段时间在看TCP/IP,在图书馆里面找了不少的书,其中有几本书还是不错的.比如: <Windows网络与通信程序设计(第二版)> 王艳平著 <WinSock网络编程经络> ...

随机推荐

  1. 注解Annotation

    @java.lang.annotation.Target(value={java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Re ...

  2. 正则表达式(java)

    概念: 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念. 正则表通常被用来检索.替换那些符合某个模式( ...

  3. CI框架2.x的验证码中所遇问题解决

    用php版本是5.6,CI框架版本是2.x,在使用验证码(captcha)时,遇到一些问题. 首先,我查看框架手册,说必需的两个参数是"img_url",“img_path”,其他 ...

  4. Oracle 使用PDB 的情况下进行备份恢复的使用.

    1. 关于directory: pdb 需要在container 上面创建directory才可以使用 CDB里面创建的directory是会无反应. 在PDB 里面创建: cmd 之后运行 set ...

  5. python之文件系统操作(os模块)

    文件系统操作(os模块) import os file_name = "D:\\test_data\\1.txt" file_name_2 = "D:\\test_dat ...

  6. codeforces500B

    New Year Permutation CodeForces - 500B User ainta has a permutation p1, p2, ..., pn. As the New Year ...

  7. Mysql误删表中数据与误删表的恢复方法

    由于头两天面试时被问了这样一个问题,如果某同事误删了某个表,你该怎么恢复? 当时想了一下,因为博主没有遇到过这个问题,但是也多少了解一些,所以就回答通过mysql的binlog日志进行恢复. 面试官当 ...

  8. BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  9. Sigma Function LightOJ - 1336 (约数和为奇数)

    题意: 求1-n中约数和为偶数的数的个数 记住一个定理:...平方数 及其 平方数的2倍 的约数和为奇数  then....减啦 证明: ....我jiao着人家写的很详细,so 看看人家写的吧! 转 ...

  10. day5 continue 和 break的区别

    # continue num = 1 while num <=10: num += 1 if num == 3: continue print(num) # continue 表示跳出本次循环后 ...