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

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    int iMapMode;
    static int cxClient, cyClient;
    switch (message)
    {
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
//创建自定义映射

        iMapMode = GetMapMode(hdc);
        SetMapMode(hdc, MM_ISOTROPIC);    //各向同性(会去干预映射过程,将多余裁剪)
        //SetMapMode(hdc, MM_ANISOTROPIC);    //各向异性(不会去干预,会自适应)
        SetWindowExtEx(hdc, 100, 100, NULL);
        //相当于取出原来逻辑窗口的100*100像素放大为现在视口的1/2*1/2(1/4) 所以现在视口所显示的最大尺寸为200*200
        SetViewportExtEx(hdc, cxClient / 2, cyClient / 2, NULL);
        //设置视口原点在中心
        SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

        //MM_ISOTROPIC: windows为了保证按比例将整个视口落在视图中,会将多余的尺寸排除在外,若是有背景,则多余为黑色,会以最大比例占据窗口(前提是和原来设置和视口和窗口之比不变的前提下)
        //MM_ANISOTROPIC:则不会,而是成比例拉伸
        Rectangle(hdc, -100, -100, 100, 100);
        Ellipse(hdc, -80, -80, 80, 80);

        EndPaint(hwnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

上面只修改了大小对应,下面则修改了方向:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    int iMapMode;
    static int cxClient, cyClient;
    switch (message)
    {
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
//创建自定义映射

        iMapMode = GetMapMode(hdc);
        //SetMapMode(hdc, MM_ISOTROPIC);    //各向同性(会去干预映射过程,将多余裁剪)
        SetMapMode(hdc, MM_ANISOTROPIC);    //各向异性(不会去干预,会自适应)
        SetWindowExtEx(hdc, 100, 100, NULL);
        //相当于取出原来逻辑窗口的100*100像素放大为现在视口的1/2*1/2(1/4) 所以现在视口所显示的最大尺寸为200*200

        //修改这里两个值得正负可以修改视口的x,y指向
        //默认MM_TEXT    x向右为正    y向下为正
        SetViewportExtEx(hdc, cxClient / 2, cyClient / 2, NULL);
        //修改后        x向左为正    y向上为正
        SetViewportExtEx(hdc, -cxClient / 2, -cyClient / 2, NULL);
        //....

        //设置视口原点在中心
        SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

        //MM_ISOTROPIC: windows为了保证按比例将整个视口落在视图中,会将多余的尺寸排除在外,若是有背景,则多余为黑色,会以最大比例占据窗口(前提是和原来设置和视口和窗口之比不变的前提下)
        //MM_ANISOTROPIC:则不会,而是成比例拉伸
        Rectangle(hdc, -100, -100, 100, 100);
        Ellipse(hdc, -80, -80, 80, 80);

        //发现采用默认MM_TEXT方式
        TextOut(hdc, -40, -40, L"Love", 4);
        TextOut(hdc, 40, 40, L"HAHA", 4);

        MoveToEx(hdc, 0, -100, NULL);
        LineTo(hdc, 0, 100);
        MoveToEx(hdc, -100, 0, NULL);
        LineTo(hdc, 100, 0);

        EndPaint(hwnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

原文地址:https://www.cnblogs.com/ssyfj/p/8511629.html

时间: 2024-11-09 10:30:13

学习windows编程 day4 之 自定义映射的相关文章

如何学习Windows编程

如何学习Windows编程 来源 https://zhuanlan.zhihu.com/p/24773204 Godbird 北京爱奇艺科技有限公司 客户端工程师  编辑于 2017-01-08 有很多初入门的小朋友跟我说,他们想学“底层”的技术,因为觉得技术含量高,所以想学Windows C++开发,看着调用一个个的参数超级多,调用起来超级麻烦的Windows API,觉着很酷.于是我念头一转,就有了这篇文章,根据我多年来做Windows 客户端的经验,跟大家谈谈Windows C++,该从哪

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

人的心理有个奇异的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解非常快就会忘得干干净净,似乎一切都是自然而然,本来就该这种.因此,关于「怎样入门」这类问题,找顶尖高手来回答,未必能比一个刚入门不久的人来回答要好.就譬如最高票的那个回答,是一个非常精通 Windows 编程的高人回答的,但这种答案能给刚開始学习的人带来多少帮助,我这里想先打一个问号. 前段时间刚辅导了一个学生学会了 Win32 GUI 编程,刚好看到这个问题,顺手就邀请他回答了.并不是是给他布置总结作业,不过希望能从他这里

有一定基础的 C++ 学习者该如何学习 Windows 编程?

人的心理有个奇妙的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解很快就会忘得干干净净,似乎一切都是自然而然,本来就该这样的.因此,关于「如何入门」这类问题,找顶尖高手来回答,未必能比一个刚入门不久的人来回答要好.就譬如最高票的那个回答,是一个非常精通 Windows 编程的高人回答的,但这样的答案能给初学者带来多少帮助,我这里想先打一个问号. 前段时间刚辅导了一个学生学会了 Win32 GUI 编程,刚好看到这个问题,顺手就邀请他回答了.并非是给他布置总结作业,仅仅是希望能从他这里得到第

学习windows编程 day1

#include <windows.h> #include <strsafe.h> /* 任务:去掉标题栏和边框 */ //#define LineHeight 15 这是自己猜测的行高,不要这样做 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanc

学习windows编程 day3 之滚动条完善

1.不再使用setscrollrange,setscrollpos,getscrollrange,getscrollpos这些函数,这只是有助于理解其中运行原理 2.改用setscrollinfo,getscrollinfo函数和结构体scrollinfo去改变和获取滚动条信息,相对于上面会更加灵活,方便扩展 3.scrollwindow:滚动窗口客户区的内容,只滚动当前显示的内容,要显示其他内容,需要重绘失效的窗口,但是相对于重绘整个窗口是一个很节省内存的方法 #include <window

学习windows编程 day2 之滚动条使用

相关函数: setscrollrange,setscrollpos,getscrollrange,getscrollpos 使用滚动条时我们需要进行的操作: 1.初始化滚动条范围和位置 在窗口创建时WM_CREATE响应时可以完成 SetScrollRange(hwnd, SB_VERT, 0, NUMLINES,FALSE); SetScrollPos(hwnd, SB_VERT, 0, TRUE); 2.处理窗口过程的滚动条消息 在响应WM_VSCROLL时处理 switch(LOWORD(

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

上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数百个API可供我们使用,本篇把最常用的GDI绘图做一个讲解.GDI可以绘制点.直线曲线.填充封闭区域.位图以及文本,其中文本部分已经在上一篇中将了,请参考[Windows编程]系列第三篇:文本字符输出. 跟前面的GDI对象一样,本篇的这些绘图函数也必须要设备上下文句柄(HDC)作为函数参数,从前文我

windows编程经典书籍

本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好.驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家发现什么好书就在楼下跟贴吧! 作者:Harry Meng 来源:互联网.也许我的阅读面过于狭小,书架里基本上都是Jeffrey Richter,Charles Petzold,侯捷老师以及潘爱民老师的书,这些书一直陪伴着我,并给我的编程工作带来了很大的帮助,希望我的推荐对你也有帮助.现 在的计算机图书

走进windows编程的世界-----位图及映射模式

1   位图的使用 1.1位图介绍 位图-通过保存在图像上每个点的颜色,生成响应的位图文件. 光栅图:图像点阵的保存 矢量图:绘图命令的保存. 1.2位图的使用 1.             加载位图资源 LoadBitap(); 2.             创建防止位图的DC CreateCompatibleDC 3.             将位图放入创建的DC SlectObject 4.             绘制位图到当前DC中 BitBlt 5.             取出位图