将文字传送到剪贴簿 |
让我们想像把一个ANSI字串传送到剪贴簿上,并且我们已经有了指向这个字串的指标(pString)。现在希望传送这个字串的iLength字元,这些字元可能以NULL结尾,也可能不以NULL结尾。 首先,通过使用GlobalAlloc来配置一个足以储存字串的记忆体块,其中还包括一个终止字元NULL: hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ; 如果未能配置到记忆体块,hGlobal的值将为NULL 。如果配置成功,则锁定这块记忆体,并得到指向它的一个指标: pGlobal = GlobalLock (hGlobal) ; 将字串复制到记忆体块中: for (i = 0 ; i < wLength ; i++) *pGlobal++ = *pString++ ; 由於GlobalAlloc的GHND旗标已使整个记忆体块在配置期间被清除为零,所以不需要增加结尾的NULL 。以下叙述为记忆体块解锁: GlobalUnlock (hGlobal) ; 现在就有了表示以NULL结尾的文字所在记忆体块的记忆体代号。为了把它送到剪贴簿中,打开剪贴簿并把它清空: OpenClipboard (hwnd) ; EmptyClipboard () ; 利用CF_TEXT识别字把记忆体代号交给剪贴簿,关闭剪贴簿: SetClipboardData (CF_TEXT, hGlobal) ; CloseClipboard () ; 工作告一段落。 |
GlobalAlloc 及其它 |
至于分配和使用内存的过程都是一样的: 调用GlobalAlloc函数分配一块内存,该函数会返回分配的内存句柄。 |
句柄vs指针 | ||||||
句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这
个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一 个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门 登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象。但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成 是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电 影院售给我们的门票总是不同的一个座位是一样的道理。 |
||||||
|
C++开发中常见问题 | |||
1,简述VC6下如何进行程序的调试。 在主菜单"Build"中,有一个Start Build的子菜单,它下面包含了Go菜单(快捷键为F5),选择后,程序将从当前语句进入调试运行,直到遇到断点或程序结束。 将鼠标移动到要调试的代码行,单击鼠标右键选择“Insert/Remove Breakpoint”,或者按下F9,可以在该行上添加断点,此时断点代码行前面出现一个棕色的圈,再次选择将清除断点。进入调试状态后,Debug菜单将取代Build菜单出现在菜单栏中,它下面包含常用的调试操作,如Step Over,单步运行并不跟踪到调用的函数内部;其他还包括Step Into,Step Out, Stop Debugging等调试方法。 2, 简述在VC6建立的工程中后缀为.cpp,.h,.rc,.dsp,.dsw的文件的作用是什么? .cpp是源程序代码C++文件 .h是包含函数声明和变量定义的头文件 .rc是定义资源的资源脚本文件 .dsp是工程文件,记录当前工程的有关信息 .dsw是工作区文件,一个工作区可能包含一个或多个工程 3, 已知一个对话框上有一个编辑框控件,ID为IDC_EDIT1,为其关联了CEdit类型的变量m_edit1,使用两种方法,说明如何改变编辑框内部的文本为"Hello",写出程序代码的片断。 第一种方法:m_edit1.SetSel(0,-1); m_edit1.ReplaceSel("Hello"); 第二种方法:SetWindowText("Hello"); 4, 简述使用Windows API编写的一个基本的Windows应用程序框架的结构。 Windows API编写的基本应用程序框架至少应该包含程序入口函数WinMain和窗口函数WndProc。在主函数WinMain里面包含窗口类的定义和注册,窗口的创建和显示以及消息循环。 5, 消息在Windows中的数据类型是什么,它有哪些成员变量,各有什么含义 消息的数据类型是MSG,它是一个结构体,其成员变量主要包括hwnd,表示消息的窗口句柄;message代表消息的类型;wParam和lParam包含消息的附加信息,随不同的消息有所不同。 6, Windows的鼠标消息的长参数lParam与字参数wParam的含义是什么 鼠标消息的长参数lParam的低字节包含了鼠标光标位置的x坐标值,lParam的高字节包含了鼠标光标位置的y坐标值;字参数wParam内包含了指示当前按下的各种虚键状态的值。 7, 说明使用一个非模态对话框的注意问题和用到的Windows API函数 使用一个非模态对话框应该注意一定要在样式中包含WS_VISIBLE才能正常显示;创建对话框使用CreateDialog函数;消息循环部分应该使用IsDialogMessage过滤消息;关闭对话框使用函数DestroyWindow。 8, 简述在MFC应用程序中UpdateData函数的作用及其参数含义与使用场合。 UpdateData只有一个BOOL类型的参数,UpdateData(FALSE)一般用于对话框控件连接的变量值刷新屏幕显示;UpdateData(TRUE)用于获取屏幕数据到对话框控件连接的变量中。 9, 列举列表框控件能够接受的三个消息类型,并说明其作用 LB_ADDSTRING用于在列表框中加入一项字符串;LB_DIR用于在列表框中列出指定文件;LB_GETTEXT用于获取指定项的文本。 10, 在一个对话框上添加了三个单选按钮,要使它们之间自动实现互斥,应该注意什么问题,在VC环境下如何操作? 要实现一组单选按钮的自动互斥,应该让它们的控件ID值连续,并设置第一个单选按钮的Group属性,其他的不设。 11, 简述由一个文档类派生自己的文档类,并实现文档的存取需要哪些步骤。 首先为每一个文档类型从CDocument派生一个相应的文档类;然后为该文档类添加成员变量以保存数据;最后重载Serialize成员函数以实现文档数据的串行化。 12, 列举视图类(CView)的三个子类,并简要说明其作用。 CScrollView类提供视图的滚动显示;CEditView类支持在视图中的文本编辑操作;CHtmlView类支持在视图中显示和操作html文件。 13, Visual C++ 6.0如何进入调试状态,在调试状态下能够显示哪些调试窗口,列举三个,其作用分别是什么? 启动调试后,在View菜单的Debug Window子菜单下可以打开一些辅助调试的窗口 Watch:显示察看当前语句和前面语句中变量值的窗口 Call Stack:显示察看调用堆栈的窗口 Memory:显示察看内存中内容的窗口 14, 说明位图资源的创建及显示过程的步骤,并给出相应的Windows API函数名。 首先定义位图句柄HBITMAP hBitmap;第二步使用LoadBitMap加载位图;第三步,调用CreateCompatibleDC向系统申请内存设备环境句柄,并调用函数SelectObject把位图选入内存设备环境;第四步,调用BitBlt函数将位图从内存设备环境输出到指定的窗口设备环境中,从而实现显示位图。 15, 如何获取字体句柄从而实现字体的输出,并给出相应的Windows API函数名。 首先定义字体句柄变量HFONT hF;然后调用函数GetStockObject获取系统的字体句柄,或者调用CreateFont得到自定义的字体句柄;最后调用SelectObject把字体句柄选入设备环境。 16, 列举三种按钮的类型,并说明其作用和创建方法之间的不同之处。 常用的按钮有普通按钮、单选按钮、复选框,和组框。普通按钮作用是帮助用户触发指定动作;单选按钮一般各选项之间存在互斥性;复选框用来显示一组选项供用户选择,各选项之间不存在互斥;组框主要用于把控件分成不同的组并加以说明. 17, 要使一个静态控件显示一个位图并能接受用户输入,应该注意什么问题。 要使静态控件显示位图,必须设定其风格包含SS_BITMAP,并在创建静态控件窗口,即调用CreateWindow时指定并加载位图;要使静态控件能够接收用户输入,必须设定其风格包含SS_NOTIFY。
|
VC实现BMP位图文件结构及平滑缩放 | ||||||||||||||||||||||
|
本文转自: http://www.cppblog.com/mzty/archive/2006/05/29/7794.html