windows应用程序与windows控制台程序当然不同,windows控制台程序运行在输入输出流中,默认是单线程,而windows应用程序则是运行在windows内部注册好的组件之上,而且默认是多线程的。printf内部的实现大概必须用到重定向到控制台的输出控制流,但windows应用程序却并不是建立在控制流之上,所以在windows程序设计中使用printf函数当然不会成功。。
VB中有shell函数来打开指定的文档
在windows API中有两个函数也可以用来打开指定的文档Winexec和ShellExecute
我想windows应该是调用API来实现的
一、Windows中的映射模式
1、Windows定义映射模式的目的
经过我的综合,Windows定义映射模的目的又以下几个方面:1、不同人的使用习惯。不同国家的,不同地区,以及不同的人因为习惯喜欢用不同的度量单位,有的人人喜欢用英寸,而有的人喜欢用公制中的厘米,毫米等。其他的人又喜欢用另外一些单位。、2、使软件与硬件向分离开来。让开发的软件能够最大限度的与硬件无关。3、提供逻辑和物理的一种转换。就相当于银行的利率。
2、默认的映射模式
默认的映射模式使MM_TEXT,它使以象素为单位的。X轴向左为正,Y轴向下为正。默认的坐标原点在左上角。
3、固定比例映射模式
固定比例的映射模式有MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH、MM_TWIPS种。它们默认的坐标原点都使在左上角。其区别在于每一个逻辑单位对应的物理大小不一样。所对用的逻辑单位分别为01毫米,001毫米,001英寸,0001英寸,1/1440英寸(00007英寸)。
4、可变比例映射模式
对于可变比例的映射模式用户可以自己定义一个逻辑单位代表的大小,其大小可以任意。也可以让这个大小随环境改变而改变。有MM_ISOTROPIC,MM_ANISOTROPIC这两种映射模式。其逻辑单位的大小等于视口范围和窗口范围的比值。两者的不同在于前者要求X轴和Y轴的度量单位必须相同,而后者没有这样的限制。
二、Windows中的几种坐标体系
1、屏幕坐标
屏幕坐标描述物理设备(显示器、打印机等)的一种坐标体系,坐标原点在屏幕的左上角,X轴向右为正,Y轴向下为正。度量单位是象素。原点、坐标轴方向、度量单位都是不能够改变的。
2、设备坐标(又称物理坐标)
设备坐标是描述在屏幕和打印机显示或打印的窗体的一种坐标体系。默认的坐标原点是在其客户区的左上角。X轴向右为正,Y轴向下为正。度量单位为象素。原点和坐标轴方向可以改变,但是度量单位不可以改变。
3、逻辑坐标
逻辑坐标是在程序中控制显示,打印使用的坐标体系。该坐标系与定义的映射模式密切相关。默认的映射模式是MM_TEXT。我们可以通过设置不同的映射模式来改变该坐标体系的默认行为。
三、逻辑坐标和设备坐标之间的转换
现有如下代码:
void CMapModeView::OnPaint()
{
CPaintDC dc(this);
//获取设备类的设置
CPoint ptOrgView,ptOrgWindow;
CSize sizeView,sizeWindow;
CString strMsg;
ptOrgView=dcGetViewportOrg();//获取视口原点
ptOrgWindow=dcGetWindowOrg();//获取窗口原点
sizeView=dcGetViewportExt();//获取视口范围
sizeWindow=dcGetWindowExt();//获取窗口范围
strMsgFormat(_T("Viewport Extent:(%d,%d),\tViewport Org:(%d,%d)\tWindow Extent:(%d,%d)\tWindow Org(%d,%d)"),
sizeViewcx,sizeViewcy,ptOrgViewx,ptOrgViewy,
sizeWindowcx,sizeWindowcy,ptOrgWindowx,ptOrgWindowy);
TRACE("%s\n",strMsg);
//设置映射模式以及原点
dcSetMapMode(MM_TEXT);//设置映射模式
dcSetWindowOrg(100,100);//设置窗口的坐标原点
dcSetViewportOrg(200,200);//设置视口的坐标原点
dcSetWindowExt(5,10);//改语句仅对可变比例映射模式有效
dcSetViewportExt(1,1);//同上
ptOrgView=dcGetViewportOrg();
ptOrgWindow=dcGetWindowOrg();
sizeView=dcGetViewportExt();
sizeWindow=dcGetWindowExt();
strMsgFormat(_T("Viewport Extent:(%d,%d),\tViewport Org:(%d,%d)\tWindow Extent:(%d,%d)\tWindow Org(%d,%d)"),
sizeViewcx,sizeViewcy,ptOrgViewx,ptOrgViewy,
sizeWindowcx,sizeWindowcy,ptOrgWindowx,ptOrgWindowy);
TRACE("%s\n",strMsg);
//将点(300,400)从逻辑坐标体系映射到设备坐标体系。
CPoint ptMap;
ptMap=CPoint(300,400);
dcLPtoDP(&ptMap);
strMsgFormat(_T("The Orginal Point(In LP):CPoint(300,400),Convert to DP is:CPoint(%d,%d)"),
ptMapx,ptMapy);
TRACE("%s\n",strMsg);
//将点(300,400)从设备坐标体系映射到逻辑坐标体系
ptMap=CPoint(300,400);
dcDPtoLP(&ptMap);
strMsgFormat(_T("The Orginal Point(In DP):CPoint(300,400),Convert to LP is:CPoint(%d,%d)"),
ptMapx,ptMapy);
TRACE("%s\n",strMsg);
}
以上代码最后调试输出结果为:
Viewport Extent:(1,1), Viewport Org:(0,0) Window Extent:(1,1) Window Org(0,0)
Viewport Extent:(1,1), Viewport Org:(200,200) Window Extent:(1,1) Window Org(100,100)
The Orginal Point(In LP):CPoint(300,400),Convert to DP is:CPoint(400,500)
The Orginal Point(In DP):CPoint(300,400),Convert to LP is:CPoint(200,300)
按照MSDN上,函数SetWindowOrg(x,y)设定设备坐标下的点(x,y)对应于逻辑坐标的原点。SetVieportOrg(x,y)设定逻辑坐标下点(x,y)对应逻辑坐标的原点。而实际上如果同时设置了逻辑坐标和设备坐标原点的话,那么以上的说法是错误的。
在默认映射模式MM_TEXT下,一个逻辑单位对应于设备坐标下的一个象素。改变默认原点以后的坐标体系如下图所示:
(0,0) Dx,Lx (0,0)
(100,100) Lx
(200,200) Dx
(300,400)
Dy,Ly Ly Dy
在VC中坐标系的转换和数学中的数学转化是不一样的。在这里是以距离为标准。首先看一下如何把点(300,400)如何从设备坐标转换成逻辑坐标。
在设备坐标体系下,点(300,400)与Y轴的距离为100个逻辑单位。那么所对应的逻辑坐标也要满足与逻辑坐标Y轴的距离为100个单位。又1个逻辑单位对应1个象素。所以所对应的设备坐标的X值为100+100=200。同样可以出对应的逻辑坐标的Y值为300。
按照同样的方法,我们也可以把逻辑坐标下的点(300,400)转换成设备坐标。在逻辑坐标下,点(300,400)与逻辑坐标Y轴的距离为200。那么在设备坐标体系,相应的设备坐标与设备坐标Y轴的距离也要为200。又1个逻辑单位对应1个象素,所以对应的设备坐标X值为200+200=400。同样的道理,可以求出对应的设备坐标Y值为500。
在这里,因为逻辑单位和设备单位一一对应,也可以把这个问题看作一个很简单的坐标平移问题来看。其结果是很显然的。
另外又找到一篇:
一、映射模式基本知识
当windows应用程序在其客户区绘制图形时,必须给出在客户区的位置,其位置用x和y 两个坐标表示,x表示横坐标,y表示纵坐标。在所有的gdi绘制函数中,这些坐标使用的是一 种"逻辑单位"。当gdi函数将输出送到某个物理设备上时,windows将逻辑坐标 转换成设备坐标(如屏幕或打印机的像素点)。逻辑坐标和设备坐标的转换是由映射模式决 定的。映射模式被储存在设备环境中。getmapmode函数用于从设备环境得到当前的映射模 式,setmapmode函数用于设置设备环境的映射模式。
1逻辑坐标
逻辑坐标是独立于设备的,它与设备点的大小无关。使用逻辑单位,是实现"所 见即所得"的基础。当程序员在调用一个画线的gdi函数lineto,画出254mm(1英寸) 长的线时,他并不需要考虑输出的是何种设备。若设备是vga显示器,windows自动将其转化 为96个像素点;若设备是一个300dpi的激光打印机,windows自动将其转化为300个像素点。
2设备坐标
windows将gdi函数中指定的逻辑坐标映射为设备坐标,在所有的设备坐标系统中, 单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。
windows中包括以下3种设备坐标,以满足各种不同需要:
(1)客户区域坐标,包括应用程序的客户区域,客户区域的左上角为(0,0)。
(2)屏幕坐标,包括整个屏幕,屏幕的左上角为(0,0)。屏幕坐标用在wm_move消息 中(对于非子窗口)以及下面的windows函数中:createwindow和movewindow(都对于非子窗 口)、getmessage、getcursorpos、getwindowrect、windowfrompoint和setbrushorg中。用函 数clienttoscreen和screentoclient可以将客户区域坐标转换成屏幕区域坐标,或反之。
(3)全窗口坐标,包括一个程序的整个窗口,包括标题条、菜单、滚动条和窗口框,窗 口的左上角为(0,0)。使用getwindowdc得到的窗口设备环境,可以将逻辑单位转换成窗口 坐标。
3逻辑坐标与设备坐标的转换方式
映射方式定义了windows如何将gdi函数中指定的逻辑坐标映射为设备坐标。要继续 讨论映射方式我们要介绍windows有关映射模式的一些术语:我们将逻辑坐标所在的坐标 系称为"窗口",将设备坐标所在的坐标系称为"视口"。
"窗口"依赖于逻辑坐标,可以是像素点、毫米或程序员想要的其他尺度。
"视口"依赖于设备坐标(像素点)。通常,视口和客户区域等同。但是,如 果程序员用getwindowdc或createdc获取了一个设备环境,则视口也可以指全窗口坐标或 屏幕坐标。点(0,0)是客户区域的左上角。x的值向右增加,y的值向上增加。
对于所有映射模式,windows都用下面两个公式将窗口坐标转换成视口坐标:
xviewport=(xwindow-xwinorg)(xviewext/xwinext)+xvieworg
yviewport=(ywindow-ywinorg)(yviewext/ywinext)+yvieworg
其中,(xwindow,ywindows)是待转换的逻辑点,(xviewport,yviewport)是转换后 的设备点。如果设备坐标是客户区域坐标或全窗口坐标,则windows在画一个对象前,还必 须将这些坐标转换成屏幕坐标。
这两个公式使用了分别指定窗口和视口原点的点:(xwinorg,ywinorg)是逻辑坐标 的窗口原点;(xvieworg,yvieworg)是设备坐标的视口原点。在缺省的设备环境中,这两个 点均设置为(0,0),但它们可以改变。此公式意味着,逻辑点(xwinorg,ywinorg)总被映射 为设备点(xvieworg,yvieworg)。
windows还能将视口(设备)坐标转换为窗口(逻辑)坐标:
xwindow=(xviewport-xvieworg)(xwinext/xviewext)+xwinorg
ywindow=(yviewport-yvieworg)(ywinext/yviewext)+ywinorg
可以使用windows提供的两个函数dptolp和lptodp在设备坐标及逻辑坐标之间互相 转换。
4映射模式的种类
windows定义了表1所列出的8种映射方式。
上述映射模式中又可分成以下3类:
映 射 方 式 逻 辑 单 位 x 轴 增 加 y 轴 增 加 毫 米 mm_text 像 素 点 右 下 与 设 备 有 关 mm_lometric 0 1mm 右 上 01 mm_himetric 0 01mm 右 上 001 mm_loenglish 0 254mm 右 上 0254 mm_hienglish 0 0254mm 右 上 00254 mm_twips 00176mm 右 上 00176 mm_isotropic 任 意(x=y) 可 选 可 选 可 设 mm_anisotropic 任 意(x!=y) 可 选 可 选 可 设
从表面上来看:控制台程序运行时是在DOS环境下,或者模拟dos环境运行的程序,运行时一般会启动一个提示符窗口。
而应用程序是Windows环境下的窗口程序。运行时一般会启动一个窗口画面。(例外,病毒木马,就不显示窗口,这决定于是否创建了窗口,或者是否让窗口显示)
但是,实质上,windows应用程序和控制台应用程序的真正区别是,PE文件的结构不同,这点不需要我们去关心,编译器会根据你的选择去构建生成的exe文件的PE结构。
如何告之编译器你的选择在编译器进行连接的时候,给它一个连接参数:
subsystem:windows或者subsystem:console来告诉它。对于大多数编程工具来说一般在“工程->设置->连接”这个表单里面就可以看到这个参数。
但是通常在我们要创建一个新的工程的时候,编译器会让我们事先选择好是创建windows应用程序还是创建控制台应用程序。这个参数的设置就不用我们 *** 心了。
补充(你可以不看,有点复杂了):事实上,控制台程序依然还有区别,那就是,16位的可以在DOS *** 作系统环境中运行的DOS程序(也可以在window运行通常windows会模拟一个dos环境,这时你会程序窗口与平时的提示符窗口明显不一样),和 32位通常只能在windows *** 作系统中运行的程序。通常32位控制台在DOS下运行,它的PE结构中会给予DOS环境下运行的一个入口点(DOS文件头),这个入口点只有“一行”代码:"This program cannot be run in DOS mode"
而在32位系统下, *** 作系统将将查看PE文件头里面的subsystem字段来获得程序将以什么方式运行(windoes或者console)这个字段里面指示了子系统(CUI对应控制台,GUI对应普通程序,驱动程序等没有子系统)32位的控制台程序当然可以调用PAI函数,而16位的DOS程序则不可以调用API函数。
再补充关于编译器的一点内容:通常大学里面学习C,c++时,最常用的是VC60
TC++30 和 TC20 VC60只能写32位程序。(也就是不能写Dos程序)
而TC++30 和 TC20这两个编译器是16位的编译器,不能写窗口程序(因为调用不了API(之所以调用不了,固然是编译器的限制,但实质是编译器根本不去使用32位寄存器))
那么,如何才能写一个即可以在DOS运行,又可以在windows下运行的程序(还要带窗口)那就是要修改exe的PE文件结构,使用人工方法粘贴代码。复杂了,不说了
1、图形编程都是用的纯C函数库,
比如Windows的GDI,还有DirectX,以及开源的OpenGL。这些都是纯C库,也就是说会C语言就能开发图形界面和游戏了。C++当然也可以调用这些函数库,但不是必要的。
2、学GDI的话最好的书是《Windows程序设计chm》这个文档,这东西网上到处都有。
学OpenGL的话,有个网站Nehe有完整的教学。人翻译了这个教程的中文版,google
“Nehe
opengl”
就能找到了。
传统的MS-DOS程序主要采用顺序的、关联的、过程驱动的程序设计方法。一个程序是一系列预先定义好的 *** 作序列的组合,它具有一定的开头、中间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序设计方法是面向程序而不是面向用户的,交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模式进行工作。
2\事件驱动程序设计是一种全新的程序设计方法,它不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的的用户用各种合理的顺序来安排程序的流程。
对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的优点。
它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。
它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
vaela
如果移出焦点和移入是同一个 则setfocus()函数不执行 所以下面的InvalidateRect(hwnd,NULL,FALSE);必须要有
pS 我也在看这本书,也有和你一样的疑问和猜测 最后在google找到上面的话 经验证是正确的 你看到哪了?
以上就是关于编程新手,求教大虾,为什么windows程序设计中不能使用printf函数全部的内容,包括:编程新手,求教大虾,为什么windows程序设计中不能使用printf函数、windows打开文件时调用的函数是什么、谁能跟我讲讲windows编程中关于设置映象模式的四个函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)