IME消息、函数、命令、需要的数据结构、常量
C/C++ 1-14 823浏览 0评论IME消息 以下列出IME中用到的消息。 WM_IME_CHAR(IME得到了转换结果中的一个字符) WM_IME_COMPOSITION(IME根据用户击键的情况更改了按键组合状态) WM_IME_COMPOSITIONFULL(IME检测到按键组合窗口的区域无法继续扩展) WM_IME_CONTROL(由应用程序直接向IME发出控制请求) WM_IME_ENDCOMPOSITION(IME完成了对用户击键情况的组合) WM_IME_KEYDOWN(检测到“键盘上的某键被按下”的动作,同时在消息队列中保留该消息) WM_IME_KEYUP(检测到“键盘上的某键已弹起”的动作,同时在消息队列中保留该消息) WM_IME_NOTIFY(IME窗口发生了改变) WM_IME_REQUEST(通知:IME需要应用程序提供命令和请求信息) WM_IME_SELECT(操作系统将改变当前IME) WM_IME_SETCONTEXT(输入焦点转移到了某个窗口上) WM_IME_STARTCOMPOSITION(IME准备生成转换结果) IME函数 本节列出了所有IME函数。 函数 说明 EnumInputContext 由应用程序定义的,提供给ImmEnumInputContext函数用来处理输入环境的一个回调函数。 EnumRegisterWordProc 由应用程序定义的,结合ImmEnumRegisterWord函数一起使用的一个回调函数。 ImmAssociateContext 建立指定输入环境与窗口之间的关联。 ImmAssociateContextEx 更改指定输入环境与窗口(或其子窗口)之间的关联。 ImmConfigureIME 显示指定的输入现场标识符的配置对话框。 ImmCreateContext 创建一个新的输入环境,并为它分配内存和初始化它。 ImmDestroyContext 销毁输入环境并释放和它关联的内存。 ImmDisableIME 关闭一个线程或一个进程中所有线程的IME功能。 ImmDisableTextFrameService 关闭指定线程的文本服务框架(TSF)功能--虽然这里把它列了出来,但建议程序员最好不要使用这个函数。 ImmEnumInputContext 获取指定线程的输入环境。 ImmEnumRegisterWord 列举跟指定读入串、样式和注册串相匹配的注册串。 ImmEscape 对那些不能通过IME API函数来访问的特殊输入法程序提供兼容性支持的一个函数。 ImmGetCandidateList 获取一个候选列表。 ImmGetCandidateListCount 获取候选列表的大小。 ImmGetCandidateWindow 获取有关候选列表窗口的信息。 ImmGetCompositionFont 获取有关当前用来显示按键组合窗口中的字符的逻辑字体的信息。 ImmGetCompositionString 获取有关组合字符串的信息。 ImmGetCompositionWindow 获取有关按键组合窗口的信息。 ImmGetContext 获取与指定窗口相关联的输入环境。 ImmGetConversionList 在不生成任何跟IME有关的消息的情况下,获取输入按键字符组合或输出文字的转换结果列表。 ImmGetConversionStatus 获取当前转换状态。 ImmGetDefaultIMEWnd 获取缺省IME类窗口的句柄。 ImmGetDescription 复制IME的说明信息到指定的缓冲区中。 ImmGetGuideLine 获取出错信息。 ImmGetIMEFileName 获取跟指定输入现场相关联的IME文件名。 ImmGetImeMenuItems 获取注册在指定输入环境的IME菜单上的菜单项。 ImmGetOpenStatus 检测IME是否打开。 ImmGetProperty 获取跟指定输入现场相关联的IME的属性和功能。 ImmGetRegisterWordStyle 获取跟指定输入现场相关联的IME所支持的样式列表。 ImmGetStatusWindowPos 获取状态窗口的位置。 ImmGetVirtualKey 获取跟IME处理的键盘输入消息相关联的初始虚拟键值。 ImmInstallIME 安装一个IME。 ImmIsIME 检测指定的输入现场是否有和它相关的IME。 ImmIsUIMessage 检查IME窗口消息并发送那些消息到特定的窗口。 ImmNotifyIME 通知IME有关输入环境状态已改变的消息。 ImmRegisterWord 注册一个输出文字到跟指定输入现场相关联的IME的字典中去。 ImmReleaseContext 销毁输入环境并解除对跟它相关联的内存的锁定。 ImmSetCandidateWindow 设置有关候选列表窗口的信息。 ImmSetCompositionFont 设置用来显示按键组合窗口中的字符的逻辑字体。 ImmSetCompositionString 设置按键组合字符串的字符内容、属性和子串信息。 ImmSetCompositionWindow 设置按键组合窗口的位置。 ImmSetConversionStatus 设置当前转换状态。 ImmSetOpenStatus 打开或关闭IME功能。 ImmSetStatusWindowPos 设置状态窗口的位置。 ImmSimulateHotKey 在指定的窗口中模拟一个特定的IME热键动作,以触发该窗口相应的响应动作。 ImmUnregisterWord 从跟指定输入环境相关联的IME的字典中注销一个输出文字。 IME命令 以下列出IME中用到的命令(控制消息)。 IMC_CLOSESTATUSWINDOW(隐藏状态窗口) IMC_GETCANDIDATEPOS(获取候选窗口的位置) IMC_GETCOMPOSITIONFONT(获取用来显示按键组合窗口中的文本的逻辑字体) IMC_GETCOMPOSITIONWINDOW(获取按键组合窗口的位置) IMC_GETSTATUSWINDOWPOS(获取状态窗口的位置) IMC_OPENSTATUSWINDOW(显示状态窗口) IMC_SETCANDIDATEPOS(设置候选窗口的位置) IMC_SETCOMPOSITIONFONT(设置用来显示按键组合窗口中的文本的逻辑字体) IMC_SETCOMPOSITIONWINDOW(设置按键组合窗口的样式) IMC_SETSTATUSWINDOWPOS(设置状态窗口的位置) IMN_CHANGECANDIDATE(IME通知应用程序:候选窗口中的内容将改变) IMN_CLOSECANDIDATE(IME通知应用程序:候选窗口将关闭) IMN_CLOSESTATUSWINDOW(IME通知应用程序:状态窗口将关闭) IMN_GUIDELINE(IME通知应用程序:将显示一条出错或其他信息) IMN_OPENCANDIDATE(IME通知应用程序:将打开候选窗口) IMN_OPENSTATUSWINDOW(IME通知应用程序:将创建状态窗口) IMN_SETCANDIDATEPOS(IME通知应用程序:已结束候选处理同时将移动候选窗口) IMN_SETCOMPOSITIONFONT(IME通知应用程序:输入内容的字体已更改) IMN_SETCOMPOSITIONWINDOW(IME通知应用程序:按键组合窗口的样式或位置已更改) IMN_SETCONVERSIONMODE(IME通知应用程序:输入内容的转换模式已更改) IMN_SETOPENSTATUS(IME通知应用程序:输入内容的状态已更改) IMN_SETSENTENCEMODE(IME通知应用程序:输入内容的语句模式已更改) IMN_SETSTATUSWINDOWPOS(IME通知应用程序:输入内容中的状态窗口的位置已更改) IMR_CANDIDATEWINDOW(通知:选定的IME需要应用程序提供有关候选窗口的信息) IMR_COMPOSITIONFONT(通知:选定的IME需要应用程序提供有关用在按键组合窗口中的字体的信息) IMR_COMPOSITIONWINDOW(通知:选定的IME需要应用程序提供有关按键组合窗口的信息) IMR_CONFIRMRECONVERTSTRING(通知:IME需要应用程序更改RECONVERTSTRING结构) IMR_DOCUMENTFEED(通知:选定的IME需要从应用程序那里取得已转换的字符串) IMR_QUERYCHARPOSITION(通知:选定的IME需要应用程序提供有关组合字符串中某个字符的位置信息) IMR_RECONVERTSTRING(通知:选定的IME需要应用程序提供一个用于自动更正的字符串) IME编程中需要用到的数据结构 这里列了所有在使用输入法编辑器函数和消息时需要用到的数据结构。 CANDIDATEFORM(描述候选窗口的位置信息) CANDIDATELIST(描述有关候选列表的信息) COMPOSITIONFORM(描述按键组合窗口的样式和位置信息) IMECHARPOSITION(描述按键组合窗口中的字符的位置信息) IMEMENUITEMINFO(描述IME菜单项的信息) RECONVERTSTRING(定义用于IME自动更正功能的字符串) REGISTERWORD(描述一个要注册的读入信息或文字内容) STYLEBUF(描述样式的标识符和名称) IME常量 这里列出了所有在使用输入法编辑器函数和消息时需要用到的常量。 ? IME转换模式常量 ? IME按键组合字符串常量 ? IME热键标识常量 ? IME句型模式常量 ? IMMEscape函数常量
【MFC】GDI字体和CFont类
C/C++ 1-14 760浏览 0评论GDI字体和CFont类 所有的CDC文本函数都使用当前选入设备描述表的字体。字体是指一组具有特定尺寸(高度)和字样的字符;字样是指字符共有的属性,如字的粗细度----正常体或黑体。在传统印刷式样中,字体尺寸大小是以point(即点)为单位来度量的。一个点相当于1/72英寸。12-点字体中的字符就有1/6英寸高。 如果想以像素为单位制定字体尺寸,则调用CreateFont或CreateFontIndirect;如果想以点为单位制定字体尺寸,则调用CreatePointFont或CreatePointFontIndirect。 使用CreateFont函数创建一个以点为单位的相同字体尺寸的字体,则需要向设备描述表查询垂直方向上每英寸内像素的逻辑个数。 传递给CreatePointFont的数值是你所期望的点的大小的10倍。这样字体尺寸就可以控制到字体的1/10,考虑到大部分屏幕和其他常见输出设备相对较低的分辨率,对于大多数应用场合,这个精度已经够用了。 不能用CreatePointFont创建一个粗黑、倾斜的字体,但用CreatePointFontIndirect就能达到目的。【上面这一段来自《MFC Windows程序设计(第2版)》】 LOGFONT是一个结构,它的字段定义了字体的所有特性。(下面解释来自百度百科http://baike.baidu.com/link?url=DzHMLGkAgJUYmSMVZax7FFX_oLy4vuvSb9AEbfIocghJF3iFJXeYT9YAg18rwfyNvPZMtuVtZ7KGqxHF1QON9a) typedef struct tagLOGFONT { // lf LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT; lfHeight: 以逻辑单位指定字体字符元(character cell)或字符的高度。字符高度值为字符元高度值减去内部行距(internal-leading)值。当lfHeight大于0时,字体映射程序将该值转换为设备单位,并将它与可用字体的字符元高度进行匹配;当该参数为0时,字体映射程度将使用一个匹配的默认高度值;如果参数的值小于0,则将其转换为设备单位,并将其绝对值与可用字体的字符高度进行匹配。对于任何一种情况,字体映射程度最终得到的字体高度值不会超过所指定的值。以MM_TEXT映射模式下,字体高度值和磅值有如下的换算公式:lfHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); lfWidth: 以逻辑单位指定字体字符的平均宽度。如果lfWidth的值为0,则根据设备的纵横比从可用字体的数字转换纵横中选取最接近的匹配值,该值通过比较两者之间的差异的绝对值得出。 lfEscapement: 以十分之一度为单位指定每一行文本输出时相对于页面底端的角度。 lfOrientation: 以十分之一度为单位指定字符基线相对于页面底端的角度。 lfWeight: 指定字体重量。在Windows中,字体重量这个术语用来指代字体的粗细程度。lfWeight的范围为0到1000,正常情况下的字体重量为400,粗体为700。如果lfWeight为0,则使用默认的字体重量。 lfItalic: 当lfItalic为TRUE时使用斜体 lfUnderline: 当lfUnderline为TRUE时给字体添加下划线 lfStrikeOut: 当lfStrikeOut为TRUE时给字体添加删除线 lfCharSet: 指定字符集。可以使用以下预定义的值:ANSI_CHARSET、BALTIC_CHARSET、CHINESEBIG5_CHARSET、DEFAULT_CHARSET、EASTEUROPE_CHARSET、GB2312_CHARSET、GREEK_CHARSET、HANGUL_CHARSET、MAC_CHARSET、OEM_CHARSET、RUSSIAN_CHARSET、SHIFTJIS_CHARSET、SYMBOL_CHARSET、TURKISH_CHARSET。 其中,OEM_CHARSET 表示字符集依赖本地操作系统。 DEFAULT_CHARSET 表示字符集基于本地操作系统。例如,系统位置是 English (United States),字符集将设置为 ANSI_CHARSET。 lfOutPrecision: 指定输出精度。输出精度定义了输出与所要求的字体高度、宽度、字符方向等的接近程度。它可以为下面的值之一:OUT_CHARACTER_PRECIS、OUT_DEFAULT_PRECIS、OUT_STRING_PRECIS、OUT_STROKE_PRECIS。 lfClipPrecision: 指定剪辑精度。剪辑精度定义了当字符的一部分超过剪辑区域时对字符的剪辑方式,它可以为下列值之一:CLIP_CHARACTER_PRECIS、CLIP_DEFAULT_PRECIS、CLIP_STROKE_PRECIS。 lfQuality: 定义输出质量。输出质量定义了图形设备接口在匹配逻辑字体属性到实际的物理字体的所使用的方式,它可以为下列值之一:DEFAULT_QUALITY (默认质量)、DRAFT_QUALITY (草稿质量)、PROOF_QUALITY (正稿质量)。 lfPitchAndFamily: 指定字体的字符间距和族。最低两位指定字体的字符间距为以下值之一:DEFAULT_PITCH、FIXED_PITCH、VARIABLE_PITCH第4到7位指定字体族为以下值之一:FF_DECORATIVE、FF_DONTCARE、FF_MODERN、FF_ROMAN、FF_SCRIPT、FF_SWISS这些值的具体含义可以参考Visual C++中关于结构LOGFONT的文档。字符间距和字体族可以使用逻辑或(OR)运算符来进行组合。 lfFaceName: 一个指定以NULL结尾的字符串,它指定的所用的字体名。该字符串的长度不得超过32个字符,如果lfFaceName为NULL,图形设备接口将使用默认的字体名。 重点说明: lfHeight字段: 铺垫:在传统印刷式样中,字体尺寸大小是以point(即点)为单位来度量的。一个点相当于1/72英寸。12-点字体中的字符就有1/6英寸高。在Windows中的一些软件中,有些字体大小是用阿拉伯数字表示的,8,9,10等等。 这个好像是磅值。 百度经常发现这个公式“百度解释:字体高度值和磅值有如下的换算公式”: lfHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); PointSize指的就是“字体尺寸大小是以point(即点)为单位来度量的”。 测试代码如下: int nPointSize = 8; int lfHeight = -MulDiv(nPointSize, GetDeviceCaps(dc.GetSafeHdc(), LOGPIXELSY), 72); CFont font; LOGFONT lf; font.CreatePointFont(80, _T("Times New Roman")); font.GetLogFont(&lf); 运行后,lfHeight与lf.lfHeight的值都等于-11.所以以点为单位度量字体大小的nPointSize与LOGFONT中的lfHeight有一定的转换关系。重点是“以点为单位度量字体大小”时候。 创建字体方法: 如果想以像素为单位制定字体尺寸,则调用CreateFont或CreateFontIndirect;如果想以点为单位制定字体尺寸,则调用CreatePointFont或CreatePointFontIndirect。 (1) CreateFont创建字体,使用的参数字体高度是以像素为单位,它与nPointSize有一个转换关系; nHeight = -((dc.GetDeviceCaps(LOGPIXELSY) * nPointSize) / 72); (2) CreateFontIndirect方法使用参数虽然也是结构体LOGFONT,但是此时结构体中lfHeight,如果为负值,它将由公式int lfHeight = -MulDiv(nPointSize, GetDeviceCaps(dc.GetSafeHdc(), LOGPIXELSY), 72)匹配一个对应点单位的字体;如果为正值,转为设备单位,应该就是像素。 (3) CreatePointFont“以点为单位度量字体大小”创建字体,但是传递给CreatePointFont的数值是你所期望的点的大小的10倍。例如nPointSize = 12,要传递的参数应该为120. (4) CreatePointFontIndirect“以点为单位度量字体大小”,在初始化LOGFONT结构体变量时,lfHeight需要传递为nPointSize * 10. 关于中文字号与点单位字体对应表 中文字号 点 初号 42 小初 36 一号 26 小一 24 二号 22 小二 18 三号 16 小三 15 四号 14 小四 12 五号 10 小五 9 六号 7 小六 6 七号 5 八号 5
MFC类目录及头文件(转)
C/C++ 11-7 1130浏览 0评论类 描述 头文件 CAnimateCtrl 自动化通用控件 afxcmn.h CArchive afx.h CArchiveException afx.h CArray afxtempl.h CAsyncMonikerFile 在ActiveX控件中提供对异步标记的支持 afxole.h CAsyncScoket 封装Windows Sockets API,参看CSocket afxsock.h CBitmap afxwin.h CBitmapButton afxext.h CBrush afxwin.h CButton 按钮控件对象 afxwin.h CByteArray afxcoll.h CCachedDataPathProperty 允许一个ActiveX控件异步传输属性数据和缓冲内存中的数据,参考CDataPathProperty afxctl.h CCheckListBox afxwin.h CClientDC afxwin.h CCmdTarget 所有能够接收和响应消息的对象的基类 afxwin.h CCmdUI afxwin.h CColorDialog 颜色选择的通用对话框,提供为显示系统定义的颜色列表 afxdlgs.h CComboBox 组合框对象 afxwin.h CComboBoxEx CComboBox类的派生类,用于支持在组合框控件中的图像列表 afxcmn.h CCommandLineInfo afxwin.h CCommonDialog afxdlgs.h CConnectionPoint afxdisp.h CControlBar afxext.h CCreateContext afxext.h CCriticalSection afxmt.h CCtrlView afxwin.h CDaoDatabase afxdao.h CDaoException afxdao.h CDaoFieldExchange afxdao.h CDaoQueryDef afxdao.h CDaoRecordset 代表选自数据源的记录集。CDaoRecordset对象可用于三种格式:表类型记录集,动态集类型记录集和快照类型记录集 afxdao.h CDaoRecordView 提供表单视图,以在控件中显示数据库记录。表单视图是CDaoRecordset对象的一部分。参考CFormView和CRecordView afxdao.h CDaoTableDef afxdao.h CDaoWorkspace afxdao.h CDatabase afxdb.h CDataExchange afxwin.h CDataPathProperty 实现一个ActiveX控件属性,它能够异步加载其数据。这个类允许ActiveX控件在后台下载属性数据时被激活 afxctl.h CDateTimeCtrl 封装新的日期/时间选取器控件 afxdtctl.h CDBException afxdb.h CDBVariant afxdb.h CDC afxwin.h CDialog 用于包含控件窗口的对话框对象 afxwin.h CDialogBar afxext.h CDocItem afxole.h CDockState afxadv.h CDocObjectServer afxdocob.h CDocObjectServerItem afxdocob.h CDocTemplate afxwin.h CDocument 用于管理程序的数据的类 afxwin.h CDragListBox Windows列表框,允许用户把其中的项拖放到不同的位置 afxcmn.h CDumpContext afx.h CDWordArray afxcoll.h CEdit 用于文本输入的子窗口控件 afxwin.h CEditView 提供Windows编缉控件的功能。因为CEditView派生于Cedit,该对象可同文件和文件模板一同使用 afxext.h CEvent afxmt.h CException afx.h CFieldExchange afxdb.h CFile afx.h CFileDialog 通用文件对话框,提供Open和Save As对话框中的功能 afxdlgs.h CFileException afx.h CFileFind afx.h CFindReplaceDialog afxdlgs.h CFont afxwin.h CFontDialog 通用字体对话框,用于显示当前已装入系统的字体列表 afxdlgs.h CFontHolder afxctl.h CFormView 包含对话框控件的窗口 afxext.h CFrameWnd SDI(单窗口界面)框架窗口 afxwin.h CFtpConnection afxinet.h CFtpFileFind afxinet.h CGdiObject afxwin.h CGopherConnection afxinet.h CGopherFile afxinet.h CGopherFileFind afxinet.h CGopherLocator afxinet.h CHeaderCtrl 标题通用控件 afxcmn.h CHotKeyCtrl 热键通用控件 afxcmn.h CHtmlStream afxisapi.h CHtmlView 实现Web Browser控件的视图类,能够访问当地或Web上的HTML文件。 afxhtml.h CHttpConnection afxinet.h CHttpFile afxinet.h CHttpFilter 创建并处理超文传输协议过滤器对象,该对象用于过滤用于HTTP请求的服务器通知 afxisapi.h CHttpFilterContext afxisapi.h CHttpServer Internet Server API(ISAPI)的包装类 afxisapi.h CHttpServerContext afxisapi.h CImageList afxcmn.h CInternetConnection afxinet.h CInternetException afxinet.h CInternetFile afxinet.h CInternetSession afxinet.h CIPAddressCtrl IP地址控件。类似于编缉框,该控件接收Internet 协议格式的地址 afxcmn.h CList afxtempl.h CListBox 列表框对象 afxwin.h CListCtrl 列表视通用控件 afxcmn.h ClistView 简化CListCtrl的使用,添加了对文件和视图的支持 afxcview.h CLongBinary afxdb_.h CMap afxtempl.h CMapPtrToPtr afxcoll.h CMapPtrToWord afxcoll.h CMapStringToOb afxcoll.h CMapStringToPtr afxcoll.h CMapStringToString afxcoll.h CMapWordToOb afxcoll.h CMapWordToPtr afxcoll.h CMDIChildWnd MDI(多文档界面)子框架窗口 afxwin.h CMDIFrameWnd afxwin.h CMemFile afx.h CMemoryException afx.h CMemoryState CMenu afxwin.h CMetaFileDC afxext.h CMiniFrameWnd 半高的框架窗口,主要用于浮动工具栏。一个小框架窗口没有最小化和最大化按钮,但其他都类似于正常的框架窗口 afxwin.h CMonikerFile afxole.h CMonthCalCtrl 月历控件,用于显示一个用户可选择日期的日历 afxdtctl.h CMultiDocTemplate afxwin.h CMultiLock afxmt.h CMutex afxmt.h CNotSupportedException afx.h CObArray afxcoll.h CObject afx.h CObList afxcoll.h COleBusyDialog afxodlgs.h COleChangeIconDialog afxodlgs.h COleChangeSourceDialog afxodlgs.h COleClientItem afxole.h COleCmdUI afxdocob.h COleControl afxctl.h COleControlModule afxctl.h COleConvertDialog afxodlgs.h COleCurrency afxdisp.h COleDataObject afxole.h COleDataSource afxole.h COleDateTime afxdisp.h COleDateTimeSpan afxdisp.h COleDBRecordView afxoledb.h COleDialog afxodlgs.h COleDispatchDriver afxdisp.h COleDispatchException afxdisp.h COleDocObjectItem afxole.h COleDocument 把一个文件看作为CDocItem对象的一个集合。包容器和服务器都需要这个结构,因为它们的文件必须能够包含OLE项 afxole.h COleDropSource afxole.h COleDropTarget afxole.h COleException afxdisp.h COleInsertDialog afxodlgs.h COleIPFrameWnd afxole.h COleLinkingDoc OLE包容器文件的基类,这些文件支持对它们所包含项的链接 afxole.h COleLinksDialog afxodlgs.h COleMessageFilter afxole.h COleObjectFactory afxdisp.h COlePasteSpecialDialog afxodlgs.h COlePropertiesDialog afxodlgs.h COlePropertyPage afxctl.h COleResizeBar afxole.h COleSafeArray afxdisp.h COleServerDoc OLE服务器文件的基类 afxole.h COleServerItem 为OLE项提供一个服务器界面 afxole.h COleStreamFile afxole.h COleTemplateServer afxdisp.h COleUpdateDialog afxodlgs.h COleVariant afxdisp.h CPageSetupDialog afxdlgs.h CPaintDC afxwin.h CPalette afxwin.h CPen afxwin.h CPictureHolder afxctl.h CPoint atltypes.h CPrintDialog 通用打印对话框,提供Print和Print Setup对话框中的功能 afxdlgs.h CPrintInfo CProgressCtrl 通用进程指示器控件 afxcmn.h CPropertyPage 代表属性表单中的一页 afxdlgs.h CPropertyPageEx CPropertySheet 属性表,也叫做多选项卡对话框。一个属性表由一个CPropertySheet对象和几个CPropertyPage对象组成 afxdlgs.h CPropertySheetEx CPropExchange afxctl.h CPtrArray afxcoll.h CPtrList afxcoll.h CReBar afxext.h CReBarCtrl afxcmn.h CRecentFileList afxadv.h CRecordset 用于访问数据库表或查询的类 afxdb.h CRecordView 包含对话框控件的窗口 afxdb.h CRect atltypes.h CRectTracker afxext.h CResourceException afxwin.h CRgn afxwin.h CRichEditCntrItem afxrich.h CRichEditCtrl 用户能够输入和编缉文本的窗口,提供字符和程序段格式,以及对嵌入OLE项的支持 afxcmn.h CRichEditDoc afxrich.h CRichEditView afxrich.h CRuntimeClass CScrollBar 滚动条对象 afxwin.h CScrollView 可滚动的窗口,派生于CView afxwin.h CSemaphore afxmt.h CSharedFile afxadv.h CSingleDocTemplate afxwin.h CSingleLock afxmt.h CSize atltypes.h CSliderCtrl 提供包含一个滑块和可选的刻度线的窗口 afxcmn.h CSocket Windows Socket API的包装类 afxsock.h CSocketFile afxsock.h CSpinButtonCtrl 提供箭头按钮,用户可单击它,以增加或减少某个控件中的一个值 afxcmn.h CSplitterWnd afxext.h CStatic 用于标识另一个控件或给用户提供消息的简单文本框 afxwin.h CStatusBar afxext.h CStatusBarCtrl 提供一个层次窗口,通常放于父窗口的底部,用于显示关于应用程序的状态信息 afxcmn.h CStdioFile afx.h CString afx.h CStringArray afxcoll.h CStringList afxcoll.h CSyncObject afxmt.h CTabCtrl 允许应用程序在一个窗口或对话框的同一区域显示多个页面 afxcmn.h CTime afx.h CTimeSpan afx.h CToolBar afxext.h CToolBarCtrl 工具栏通用控件 afxcmn.h CToolTipCtrl 提供工具提示控件的功能,它以一个小弹出窗口的样子显示,包含描述某个工具用途的一行文本 afxcmn.h CTreeCtrl 显示项的分层结构列表 afxcmn.h CTreeView 简化CTreeCtrl的用法 afxcview.h CTypedPtrArray afxtempl.h CTypedPtrList afxtempl.h CTypedPtrMap afxtempl.h CUIntArray afxcoll.h CUserException afxwin.h CView 用于显示程序数据的类 afxwin.h CWaitCursor afxwin.h CWinApp afxwin.h CWindowDC afxwin.h CWinThread 代表一个应用程序中的一个线程 afxwin.h CWnd afxwin.h CWordArray afxcoll.h
WS,窗口样式
C/C++ 10-17 855浏览 0评论1 窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_POPUP合用) WS_MINIMIZE 创建窗口拥有最小化按钮 WS_MINIMIZEBOX 创建窗口拥有最小化按钮,须同时指定WS_SYSTEM样式 WS_VISIBLE 可见状态 WS_DISABLED 不可用状态 WS_CLIPSIBLINGS 使窗口排除子窗口之间的相对区域 WS_CLIPCHILDREN 当在父窗口内绘图时,排除子窗口区域 WS_MAXIMIZE 具有最大化按钮 WS_MAXIMIZEBOX 创建窗口拥有最大化按钮,须同时指定WS_SYSTEM样式 WS_CAPTION 有标题框和边框(和WS_TILED样式相同) WS_BORDER 有单边框 WS_DLGFRAME 带对话框边框样式,不带标题框 WS_VSCROLL 有垂直滚动条 WS_HSCROLL 有水平滚动条 WS_SYSMENU 标题框上带有窗口菜单(须指定WS_CAPTION样式) WS_THICKFRAME 有可调边框(与WS_SIZEBOX样式相同) WS_TILED 与WS_OVERLAPPED风格相同 WS_TILEDWINDOW 与WWS_OVERLAPPEDWINDOW风格相同 WS_GROUP 组样式,每个组的第一个控件具有WS_TABSTOP样式 WS_TABSTOP 可接受TAB键 WS_OVERLAPPED 创建一个重叠式窗口,拥有标题栏和边框 WS_OVERLAPPEDWINDOW WS_OVERLAPPED风格 WS_CAPTION风格 WS_SYSMENU风格 WS_THICKFRAME风格 WS_MINIMIZEBOX风格 WS_MAXIMIZEBOX风格 2 窗口扩展样式参考列表 WS_EX_DLGMODALFRAME 带双层边框 WS_EX_NOPARENTNOTIFY 创建/销毁时不通知父窗口 WS_EX_TOPMOST 窗口置顶(停留在所有非最高层窗口的上面) WS_EX_ACCEPTFILES 可接受文件拖放 WS_EX_TRANSPARENT 透明样式,在同属窗口已重画时该窗口才可重画 WS_EX_MDICHILD MDI子窗口样式 WS_EX_TOOLWINDOW 工具条窗口样式 WS_EX_WINDOWEDGE 带凸起边缘的边框 WS_EX_CLIENTEDGE 带阴影的边缘 WS_EX_CONTEXTHELP 有上下文帮助样式,标题栏包含一个问号标志 WS_EX_RIGHT 右对齐 WS_EX_RTLREADING 窗口文本从右到左显示 WS_EX_LEFTSCROLLBAR 垂直滚动条在窗口左边界 WS_EX_CONTROLPARENT 允许用户使用TAB键在窗口的子窗口间搜索 WS_EX_STATICEDGE 当窗口为不可用状态时创建一个三维边缘 WS_EX_APPWINDOW 当窗口可见时将一个顶层窗口放置在任务栏上 WS_EX_OVERLAPPEDWINDOW 带凸起边缘的边框,边缘有阴影 WS_EX_PALETTEWINDOW 带立体边框,有工具条窗口样式,窗口在顶层 WS_EX_LAYERED = &H80000 分层或透明窗口,该样式可使用混合特效 WS_EX_NOINHERITLAYOUT 子控件不继承窗体或控件的布局 WS_EX_LAYOUTRTL 窗体或控件将具有从右向左的布局(因而会被镜像) WS_EX_COMPOSITED 用双缓冲从下到上绘制窗口的所有子孙(WinXP以上) WS_EX_NOACTIVATE 处于顶层但不激活 3 按钮风格 BS_AUTOCHECKBOX 同复选按钮类似,点击一下选中,再次点击取消。 BS_AUTORADIOBUTTON 同单选按钮类似,点击后选中标志将从同组的其他单选按钮处移到当前选项。 BS_CHECKBOX 复选按钮 BS_DEFPUSHBUTTON 默认普通按钮,具有较黑的边框。 BS_GROUPBOX 分组框 BS_LEFTTEXT 同单选按钮或复选按钮配合使用,标题将显示在左侧。 BS_OWNERDRAW 可创建一个拥有者自绘按钮。 BS_PUSHBUTTON 普通下压按钮 BS_RADIOBUTTON 圆形单选按钮 BS_3STATE 三态复选按钮,三种状态即:选中,未选中,未定 BS_AUTOCHECKBOX 检查框,按钮的状态会自动改变 BS_AUTORADIOBUTTON 圆形选择按钮,按钮的状态会自动改变 BS_AUTO3STATE 允许按钮有三种状态即:选中,未选中,未定 BS_CHECKBOX 检查框 BS_LEFTTEXT 左对齐文字 4 旋转按钮控件 UDS_HORZ 指定一个水平旋转按钮.若不指定该风格则创建一个垂直的旋转按钮 UDS_WRAP 当旋转按钮增大到超过最大值时,自动重置为最小值,当减小至低于最小值时,自动重置为最大值 UDS_ARROWKEYS 当用户按下向下或向上箭头键时,旋转按钮值递增或递减 UDS_SETBUDDYINT 旋转按钮将自动更新伙伴控件中显示的数值,如果伙伴控件能接受输入,则可在伙伴控件中输入新的旋转按钮值 UDS_NOTHOUSANDS 伙伴控件中显示的数值每隔三位没有千位分隔符 UDS_AUTOBUDDY 自动使旋转按钮拥有一个伙伴控件 UDS_ALIGNRIGHT 旋转按钮在伙伴控件的右侧 UDS_ALIGNLEFT 旋转按钮在伙伴控件的左侧 5 轨道条控件 TBS_HORZ 指定一个水平轨道条.该风格是默认的 TBS_VERT 指定一个垂直轨道条 TBS_AUTOTICKS 在范围设定后,自动为轨道条加上刻度 TBS_NOTICKS 轨道条无刻度 TBS_BOTTOM 在水平轨道条的底部显示刻度,可与TBS_TOP一起使用 TBS_TOP 在水平轨道条的顶部显示刻度,可与TBS_BOTTOM一起使用 TBS_RIGHT 在垂直轨道条的右侧显示刻度,可与TBS_LEFT一起使用 TBS_LEFT 在垂直轨道条的左侧显示刻度,可与TBS_RIGHT一起使用 TBS_BOTH 在轨道条的上下部或左右两侧都显示刻度 TBS_ENABLESELRANGE 在轨道条中显示一个选择范围 6 文本编辑框风格 ES_AUTOHSCROLL 当在行尾添加一个字符后自动向右滚动10个字符 ES_AUTOVSCROLL 当输入回车后自动上滚一行 ES_CENTER 字符居中显示 ES_LEFT 字符左对齐 ES_LOWERCASE 统一转化为小写字母 ES_MULTILINE 允许多行显示 ES_NOHIDESEL 当编辑失去焦点时隐藏对字符的选定,重新获得焦点后以反色显示选中内容 ES_OEMCONVERT 将ANSI字符转化为OEM字符 ES_PASSWORD 以星号显示字符,多用于回显密码 ES_RIGHT 字符右对齐 ES_UPPERCASE 统一转化为大写字母 ES_READONLY 设置字符为只读 ES_WANTRETURN 接受回车键输入 7 列表框风格 LBS_STANDARD 创建一个具有边界和垂直滚动条、当选择发生变化或条目被双击时能够通知父窗口的标准列表框。所有条目按字母排序 LBS_SORT 按字母排序 LBS_NOSEL 条目可视但不可选 LBS_NOTIFY 当用户选择或双击一个串时,发出消息通知父窗口 LBS_DISABLENOSCROLL 在条目不多时依然显示并不起作用的滚动条 LBS_MULTIPLESEL 允许条目多选 LBS_EXTENDEDSEL 可用SHIFT和鼠标或指定键组合来选择多个条目 LBS_MULTICOLUMN 允许多列显示 LBS_OWNERDRAWVARIABLE 创建一个拥有者画列表框,条目高度可以不同 LBS_OWNERDRAWFIXED 创建一个具有相同条目高度的拥有者画列表框 LBS_USETABSTOPS 允许使用TAB制表符 LBS_NOREDRAW 当条目被增删后不自动更新列表显示 LBS_HASSTRINGS 记忆了添加到列表中的字串 LBS_WANTKEYBOARDINPUT 当有键按下时向父窗口发送WM_VKEYTOITEM或WM_CHARTOITEM消息 LBS_NOINTEGRALHEIGHT 按程序设定尺寸创建列表框 8 组合框风格 CBS_AUTOHSCROLL 当在行尾输入字符时自动将编辑框中的文字向右滚动 CBS_DROPDOWN 同CBS_SIMPLE风格类似,只是只有在用户点击下拉图标时才会显示出下拉列表 CBS_DROPDOWNLIST 同CBS_DROPDOWN类似,只是显示当前选项的编辑框为一静态框所代替 CBS_HASSTRINGS 创建一个包含了由字串组成的项目的拥有者画组合框 CBS_OEMCONVERT 将组合框中的ANSI字串转化为OEM字符 CBS_OWNERDRAWFIXED 由下拉列表框的拥有者负责对内容的绘制;列表框中各项目高度相同 CBS_OWNERDRAWVARIABLE 由下拉列表框的拥有者负责对内容的绘制;列表框中各项目高度可以不同 CBS_SIMPLE 下拉列表始终显示 CBS_SORT 自动对下拉列表中的项目进行排序 CBS_DISABLENOSCROLL 当下拉列表显示内容过少时显示垂直滚动条 CBS_NOINTEGRALHEIGHT 在创建控件时以指定的大小来精确设定组合框尺寸 9 树形视图控件 TVS_HASLINES 在父项与子项间连线以清楚地显示结构 TVS_LINESATROOT 只在根部画线 TVS_HASBUTTONS 显示带有"+"或"-"的小方框来表示某项能否被展开或已展开 TVS_EDITLABELS 用户可以编辑表项的标题 TVS_SHOWSELALWAYS 即使控件失去输入焦点,仍显示出项的选择状态 TVS_DISABLEDRAGDROP 不支持拖动操作 10 列表视图控件 LVS_ALIGNLEFT 当显示格式是大图标或小图标时,标题放在图标的左边.缺省情况下标题放在图标的下面 LVS_ALIGNTOP 当显示格式是大图标或小图标时,标题放在图标的上边 LVS_AUTOARRANGE 当显示格式是大图标或小图标时,自动排列控件中的表项 LVS_EDITLABELS 用户可以修改标题 LVS_ICON 指定大图标显示格式 LVS_LIST 指定列表显示格式 LVS_NOCOLUMNHEADER 在报告格式中不显示列的表头 LVS_NOLABELWRAP 当显示格式是大图标时,使标题单行显示.缺省时是多行显示 LVS_NOSCROLL 列表视图无滚动条 LVS_NOSORTHEADER 报告列表视图的表头不能作为排序按钮使用 LVS_OWNERDRAWFIXED 由控件的拥有者负责绘制表项 LVS_REPORT 指定报告 显示格式 LVS_SHAREIMAGELISTS 使列表视图共享图像序列 LVS_SHOWSELALWAYS 即使控件失去输入焦点,仍显示出项的选择状态 LVS_SINGLESEL 指定一个单选择列表视图.缺省时可以多项选择 LVS_SMALLICON 指定小图标显示格式 LVS_SORTASCENDING 按升序排列表项 LVS_SORTDESCENDING 按降序排列表项 11 静态文本框风格 SS_CENTER 字符居中显示 SS_LEFT 字符左对齐 SS_LEFTNOWORADWRAP 字符左对齐,可处理TAB制表符,不支持自动换行,超过末尾字符被裁剪 SS_BLACKRECT 用窗口边框色填充的矩形 SS_BLSCKFRAME 矩形边框,与窗口边框同色 SS_GRAYRECT 用屏幕背景色填充的矩行 SS_GRAYFRAME 矩形边框,使用屏幕背景色 SS_WHITERECT 用窗口背景色填充的矩行 SS_RIGHT 字符右对齐 SS_WHITEFRAME 矩形边框,使用窗口背景色 12 控件样式参考列表 DS_ABSALIGN 对话框的坐标为屏幕坐标(缺省为客户区坐标) DS_SYSMODAL 系统模式(仅支持16位程序),不能与DS_CONTROL同用 DS_LOCALEDIT 在对话框内部为编辑框分配内存(仅支持16位程序) DS_SETFONT 可定制对话框字体 DS_MODALFRAME 框架样式(不能与WS_CAPTION同用) DS_NOIDLEMSG 无空闲消息 DS_SETFOREGROUND 使对话框在最前面显示 DS_3DLOOK 四周有3维边框 DS_FIXEDSYS 使用系统固定字体 DS_NOFAILCREATE 忽略创建过程中的错误 DS_CONTROL 控件模式,可作为其他对话框的子窗口 DS_CENTER 在屏幕居中 DS_CENTERMOUSE 在鼠标位置居中 DS_CONTEXTHELP 有上下文帮助按钮
修改窗口属性(全部都是SetWindowLong设置)
C/C++ 10-16 868浏览 0评论说明: 以下函数对于POPUP窗口有效,对于子窗口好像不行。 //最小化按钮有效 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) | WS_MINIMIZEBOX ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); //最小化按钮无效 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) &~WS_MINIMIZEBOX ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); //最大化按钮有效 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) | WS_MAXIMIZEBOX ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); //最大化按钮无效 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) &~WS_MAXIMIZEBOX ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); //关闭按钮有效 ::EnableMenuItem(::GetSystemMenu(m_hWnd,false),SC_CLOSE,MF_BYCOMMAND | MF_GRAYED); //关闭按钮无效 ::EnableMenuItem(::GetSystemMenu(m_hWnd,false),SC_CLOSE,MF_BYCOMMAND | MF_ENABLED); //工具栏窗口。在任务栏上没有程序显示,需要添加在OnInitDialog()里 ::SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE) &~WS_EX_APPWINDOW|WS_EX_TOOLWINDOW ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE); //添加标题栏 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) | WS_CAPTION ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); //取消标题栏 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_CAPTION ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); //取消标题栏,保留3d边框,可调整窗口大小 ::SetWindowLong(m_hWnd,GWL_STYLE, GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_CAPTION | WS_THICKFRAME ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); //一定要加这句设置才会立即生效 //取消标题栏和3d边框,保留一个线条的细边框,不能调整窗口大小 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_CAPTION & ~WS_THICKFRAME | WS_BORDER ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); //如果有WS_EX_DLGMODALFRAME还要取消WS_EX_DLGMODALFRAME // ::SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE) // & ~WS_EX_DLGMODALFRAME); // ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE); //取消所有边框 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_CAPTION & ~WS_THICKFRAME ); ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); // //如果有WS_EX_DLGMODALFRAME还要取消WS_EX_DLGMODALFRAME // ::SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE) // & ~WS_EX_DLGMODALFRAME); // ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE); VC++6.0 如何去掉MFC向导生成的SDI程序中视图边框的3D效果2010-03-24 17:48先要去掉view的边框,代码如下: BOOL CSDIView::PreCreateWindow(CREATESTRUCT& cs) { cs.style &=~WS_BORDER;//加入的代码 return CFormView::PreCreateWindow(cs); } 然后在去掉外部Frame的客户区边框,代码如下: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.dwExStyle&=~WS_EX_CLIENTEDGE;//加入的代码,一定要在CFrameWnd::PreCreateWindow(cs)之后执行 return TRUE; }
用CInternetSession下载文件
C/C++ 11-7 1191浏览 0评论bool InternetDownload(const CString &strURL, const CString &strFN) ...{ CInternetSession internetSession("SecurityScan.exe",0); //第一个参数不能为空 BOOL bSucceed = TRUE; try ...{ CStdioFile * pFile = internetSession.OpenURL(strURL); if(pFile != NULL) ...{ CFile cf; if(!cf.Open(strFN, CFile::modeCreate | CFile::modeWrite, NULL)) ...{ return FALSE; } BYTE Buffer[512]; ZeroMemory(Buffer, sizeof(Buffer)); int nReadLen = 0; while((nReadLen = pFile->Read(Buffer, sizeof(Buffer))) > 0) ...{ cf.Write(Buffer, nReadLen); } cf.Close(); pFile->Close() ; delete pFile; } } catch (CInternetException& e) ...{ char szBuffer[128]; ZeroMemory(szBuffer, sizeof(szBuffer)); e.GetErrorMessage(szBuffer, sizeof(szBuffer), NULL); TRACE("InternetDownload, Exception: %s ",szBuffer); } catch(...) ...{ TRACE("InternetDownload, Exception: ... "); } internetSession.Close() ; if(!bSucceed) DeleteFile(strFN); return bSucceed; }
c++ http下载文件
C/C++ 11-7 1975浏览 0评论#include <afx.h> #include <afxinet.h> #define RECVPACK_SIZE 2048 bool DownloadSaveFiles(char* url,char *strSaveFile) {//下载文件并保存为新文件名 bool ret=false; CInternetSession Sess("lpload"); Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT , 2000); //2秒的连接超时 Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT , 2000); //2秒的发送超时 Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT , 2000); //2秒的接收超时 Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT , 2000); //2秒的发送超时 Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 2000); //2秒的接收超时 DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ; CHttpFile* cFile = NULL; char *pBuf = NULL; int nBufLen = 0 ; do { try{ cFile = (CHttpFile*)Sess.OpenURL(url,1,dwFlag); DWORD dwStatusCode; cFile->QueryInfoStatusCode(dwStatusCode); if (dwStatusCode == HTTP_STATUS_OK) { //查询文件长度 DWORD nLen=0; cFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, nLen); //CString strFilename = GetFileName(url,TRUE); nBufLen=nLen; if (nLen <= 0) break;// //分配接收数据缓存 pBuf = (char*)malloc(nLen+8); ZeroMemory(pBuf,nLen+8); char *p=pBuf; while (nLen>0) { //每次下载8K int n = cFile->Read(p,(nLen<RECVPACK_SIZE)?nLen:RECVPACK_SIZE); //接收完成退出循环 if (n <= 0) break;// //接收缓存后移 p+= n ; //剩余长度递减 nLen -= n ; } //如果未接收完中断退出 if (nLen != 0) break; //接收成功保存到文件 CFile file(strSaveFile, CFile::modeCreate | CFile::modeWrite); file.Write(pBuf,nBufLen); file.Close(); ret = true; } } catch(...) { break;// } } while(0); //释放缓存 if (pBuf) { free(pBuf); pBuf=NULL; nBufLen = 0 ; } //关闭下载连接 if (cFile) { cFile->Close(); Sess.Close(); delete cFile; } return ret; } int main() { DownloadSaveFiles("http://www.nirsoft.net/utils/nircmd.zip","d:\\cppdld_nircmd.zip"); return 0; }
C++的post请求(使用的是CInternetSession)
C/C++ 11-7 2012浏览 0评论// WebPost.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" //int _tmain(int argc, _TCHAR* argv[]) //{ // return 0; //} #include <iostream> #include <string> #include <afxinet.h> //定义了MFC CInternetSession类等 bool PostHttpPage(const CString& hostName, const CString& pathName, const std::string& postData) { using namespace std; CInternetSession session(_T("your app agent name")); try { INTERNET_PORT nPort = 80; DWORD dwRet = 0; CHttpConnection* pServer = session.GetHttpConnection(hostName, nPort); CHttpFile* pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, pathName); CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded"); // 请求头 //开始发送请求 pFile->SendRequest(strHeaders,(LPVOID)postData.c_str(),postData.size()); pFile->QueryInfoStatusCode(dwRet); if (dwRet == HTTP_STATUS_OK) { CString result, newline; while(pFile->ReadString(newline)) { //循环读取每行内容 result += newline+"\r\n"; } std::cout<<result<<std::endl;//显示返回内容 } else { return false; } delete pFile; delete pServer; } catch (CInternetException* pEx) { //catch errors from WinInet TCHAR pszError[200]; pEx->GetErrorMessage(pszError, 200); std::cout<<pszError<<std::endl;//显示异常信息 return false; } session.Close(); return true; } int main(void) { //向http://current.sinaapp.com/post.php发送数据 PostHttpPage(_T("current.sinaapp.com"),_T("post.php"),"name=rain&age=12"); }
c++获取屏幕分辨率
C/C++ 10-9 1417浏览 0评论获取屏幕分辨率: DEVMODE DevMode; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DevMode); DevMode.dmPelsWidth; DevMode.dmPelsHeight; 获取屏幕分辨率(不包含任务栏): int cx = GetSystemMetrics(SM_CXFULLSCREEN); int cy = GetSystemMetrics(SM_CYFULLSCREEN); --------------------- 作者:星星test 来源:CSDN 原文:https://blog.csdn.net/a3845021/article/details/54894594?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!
WM_NCHITTEST有21种取值
C/C++ 10-9 960浏览 0评论常用的有HTCAPTION,HTCLIENT,HTBORDER,HTSYSMENU,HTTRANSPARENT,罗列所有VCL里对其使用的情况 我为了移动一个无标题栏的窗体,使用了WM_NCHITTEST消息,这个消息大概如下: 通常,我们拖动对话框窗口的标题栏来移动窗口,但有时候,我们想通过鼠标在客户区上拖动来移动窗口。 一个容易想到的方案是,处理鼠标消息WM_LBUTTONDOWN和WM_LBUTTONUP。在OnLButtonUp函数中计算鼠标位置的变化,调用MoveWindow实现窗口的移动。 注意,拖动标题栏移动窗口的时候,会出现一个矩形框,它提示了窗口移动的当前位置。当鼠标左键放开的时候,窗口就移动到矩形框所在位置。而我们的实现方案中没有这个功能。 要实现此功能,我们必须自己来画这些矩形。 事实上,我们没有必要自己来做这件事情,因为Windows已经给我们做好了。 试想,如果我能够欺骗Windows,告诉它现在鼠标正在拖动的是标题栏而不是客户区,那么窗口移动操作就由Windows来代劳了。 要欺骗Windows并不像想像中的困难,甚至非常简单。 我们利用一个消息:WM_NCHITTEST。 MSDN对它的解释是: The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released. If the mouse is not captured, the message is sent to the window beneath the cursor. Otherwise, the message is sent to the window that has captured the mouse. 这个消息是当鼠标移动或者有鼠标键按下时候发出的。 Windows用这个消息来做什么? “HITTEST”就是“命中测试”的意思,WM_NCHITTEST消息用来获取鼠标当前命中的位置。 WM_NCHITTEST的消息响应函数会根据鼠标当前的坐标来判断鼠标命中了窗口的哪个部位,消息响应函数的返回值指出了部位,例如它可能会返回HTCAPTION,或者HTCLIENT等。(其返回值有很多,请查阅MSDN)。 为了便于理解,我先描述一下Windows对鼠标键按下的响应流程: 1. 确定鼠标键点击的是哪个窗口。Windows会用表记录当前屏幕上各个窗口的区域坐标,当鼠标驱动程序通知Windows鼠标键按下了,Windows根据鼠标的坐标确定它点击的是哪个窗口。 2. 确定鼠标键点击的是窗口的哪个部位。Windows会向鼠标键点击的窗口发送WM_NCHITTEST消息,来询问鼠标键点击的是窗口的哪个部位。(WM_NCHITTEST的消息响应函数的返回值会通知Windows)。通常来说,WM_NCHITTEST消息是系统来处理的,用户一般不会主动去处理它(也就是说,WM_NCHITTEST的消息响应函数通常采用的是Windows默认的处理函数)。 3. 根据鼠标键点击的部位给窗口发送相应的消息。例如:如果WM_NCHITTEST的消息响应函数的返回值是HTCLIENT,表示鼠标点击的是客户区,则Windows会向窗口发送WM_LBUTTONDOWN消息;如果WM_NCHITTEST的消息响应函数的返回值不是HTCLIENT(可能是HTCAPTION、HTCLOSE、HTMAXBUTTON等),即鼠标点击的是非客户区,Windows就会向窗口发送WM_NCLBUTTONDOWN消息。 我们有必要详细讨论一下:如果WM_NCHITTEST的消息响应函数的返回值是HTCAPTION,即指示了鼠标点击了标题栏,接下去Windows的处理是怎样的? 上面已经提到,接下来,Windows会向窗口发送WM_NCLBUTTONDOWN消息。 MSDN对WM_NCLBUTTONDOWN消息描述如下: WM_NCLBUTTONDOWN nHittest = (INT) wParam; // hit-test value pts = MAKEPOINTS(lParam); // position of cursor WM_NCLBUTTONDOWN的wParam指示了鼠标点击的窗口部位,lParam指示了当前鼠标的坐标。 如果应用程序没有对该消息响应,则由系统默认处理。 系统默认处理又是怎样的呢?系统发现wParam指示了鼠标点击的是标题栏,就会标识当前窗口处于“拖拽状态”(Windows内部记录了每个窗口的状态信息)。由于标识了“拖拽状态”,则从此刻起到鼠标键放开之前,你的鼠标移动状况完全由Windows跟踪。它根据鼠标的移动,使得窗口作“同步”移动。 注意,这个过程中,窗口不会收到WM_NCMOUSEMOVE消息,因为窗口和鼠标是“同步”移动的,你的鼠标相对于窗口是静止的。 但问题同时也出现了, 我想在右键这个窗体的时候弹出一个菜单, 当我完成 MSG_WM_RBUTTONDOWN 这个消息的时候,发现窗体收不到这个消息, 将WM_NCHITTEST消息的实现去掉就可以了,看了一原因是: 因为你在WM_NCHITTEST中处理了鼠标消息,把他定位成HTCAPTION,也就是鼠标在标题栏上,而标题栏属于非客户区(NC); 非客户区的事件消息都是以WM_NC开头的。也就是说,当你的WM_NCHITTEST返回HTCAPTION时,原来可以用WM_LBUTTONUP处理的消息,你只能用WM_NCLBUTTONUP来处理。 解决方法: 同时处理WM_NCHITTEST和WM_NCRBUTTONUP,而不处理WM_RBUTTONUP http://www.cnblogs.com/GnagWang/archive/2010/09/12/1824394.html ----------------------------------------------------------------------- · HTBORDER 在不具有可变大小边框的窗口的边框上。 · HTBOTTOM 在窗口的水平边框的底部。 · HTBOTTOMLEFT 在窗口边框的左下角。 · HTBOTTOMRIGHT 在窗口边框的右下角。 · HTCAPTION 在标题条中。 · HTCLIENT 在客户区中。 · HTERROR 在屏幕背景或窗口之间的分隔线上(与HTNOWHERE相同,除了Windows的DefWndProc函数产生一个系统响声以指明错误)。 · HTGROWBOX 在尺寸框中。 · HTHSCROLL 在水平滚动条上。 · HTLEFT 在窗口的左边框上。 · HTMAXBUTTON 在最大化按钮上。 · HTMENU 在菜单区域。 · HTMINBUTTON 在最小化按钮上。 · HTNOWHERE 在屏幕背景或窗口之间的分隔线上。 · HTREDUCE 在最小化按钮上。 · HTRIGHT 在窗口的右边框上。 · HTSIZE 在尺寸框中。(与HTGROWBOX相同) · HTSYSMENU 在控制菜单或子窗口的关闭按钮上。 · HTTOP 在窗口水平边框的上方。 · HTTOPLEFT 在窗口边框的左上角。 · HTTOPRIGHT 在窗口边框的右上角。 · HTTRANSPARENT 在一个被其它窗口覆盖的窗口中。 · HTVSCROLL 在垂直滚动条中。 · HTZOOM 在最大化按钮上。 VCL里的使用情况: procedure TControl.CMHitTest(var Message: TCMHitTest); begin Message.Result := HTCLIENT; // 凡是转发到TControl的,都是位于客户区 end; procedure TWinControl.WMNCHitTest(var Message: TWMNCHitTest); begin with Message do if (csDesigning in ComponentState) and (FParent <> nil) then Result := HTCLIENT // 组件处于设计状态时,都算作位于客户区 else inherited; end; procedure TWinControl.WndProc(var Message: TMessage); var Form: TCustomForm; begin case Message.Msg of WM_SETFOCUS: begin Form := GetParentForm(Self); if (Form <> nil) and not Form.SetFocusedControl(Self) then Exit; end; WM_KILLFOCUS: if csFocusing in ControlState then Exit; WM_NCHITTEST: begin inherited WndProc(Message); // 一般情况下委托给父类函数处理 if (Message.Result = HTTRANSPARENT) and (ControlAtPos(ScreenToClient( SmallPointToPoint(TWMNCHitTest(Message).Pos)), False) <> nil) then Message.Result := HTCLIENT; // 但如果父类的处理结果是透明,那么就重新测试,并且算位于客户区 Exit; end; WM_MOUSEFIRST..WM_MOUSELAST: begin if Message.Msg = WM_LBUTTONUP then begin tag := 50; end; if IsControlMouseMsg(TWMMouse(Message)) then begin { Check HandleAllocated because IsControlMouseMsg might have freed the window if user code executed something like Parent := nil. } if (Message.Result = 0) and HandleAllocated then DefWindowProc(Handle, Message.Msg, Message.wParam, Message.lParam); Exit; end; end; WM_KEYFIRST..WM_KEYLAST: if Dragging then Exit; WM_CANCELMODE: if (GetCapture = Handle) and (CaptureControl <> nil) and (CaptureControl.Parent = Self) then CaptureControl.Perform(WM_CANCELMODE, 0, 0); end; inherited WndProc(Message); end; procedure TWinControl.WMSetCursor(var Message: TWMSetCursor); var Cursor: TCursor; Control: TControl; P: TPoint; begin with Message do if CursorWnd = FHandle then case Smallint(HitTest) of // 其中HitTest是TWMSetCursor消息结构体自带的Word类型数据 HTCLIENT: // 如果位于客户区,则进行一系列处理,包括改变光标和进一步测试 begin Cursor := Screen.Cursor; if Cursor = crDefault then begin GetCursorPos(P); Control := ControlAtPos(ScreenToClient(P), False); if (Control <> nil) then if csDesigning in Control.ComponentState then Cursor := crArrow else Cursor := Control.FCursor; if Cursor = crDefault then if csDesigning in ComponentState then Cursor := crArrow else Cursor := FCursor; end; if Cursor <> crDefault then begin Windows.SetCursor(Screen.Cursors[Cursor]); Result := 1; Exit; end; end; HTERROR: // 如果测试出错,则把当前程序设置为最前窗口,并且退出测试(以利于进一步测试) if (MouseMsg = WM_LBUTTONDOWN) and (Application.Handle <> 0) and (GetForegroundWindow <> GetLastActivePopup(Application.Handle)) then begin Application.BringToFront; Exit; end; end; inherited; end; procedure TWinControl.CMCursorChanged(var Message: TMessage); var P: TPoint; begin if GetCapture = 0 then begin GetCursorPos(P); if FindDragTarget(P, False) = Self then Perform(WM_SETCURSOR, Handle, HTCLIENT); // 当移动目的控件是当前Win控件的时候,就发送设置焦点的消息,并且传递Handle和HTCLIENT做进一步的处理 end; end; 其中还有对CM_HITTEST的处理情况: function TWinControl.ControlAtPos(const Pos: TPoint; AllowDisabled, AllowWinControls: Boolean): TControl; var I: Integer; P: TPoint; LControl: TControl; function GetControlAtPos(AControl: TControl): Boolean; begin with AControl do begin P := Point(Pos.X - Left, Pos.Y - Top); Result := PtInRect(ClientRect, P) and ((csDesigning in ComponentState) and (Visible or not (csNoDesignVisible in ControlStyle)) or (Visible and (Enabled or AllowDisabled) and (Perform(CM_HITTEST, 0, Longint(PointToSmallPoint(P))) <> 0))); // 在VCL内部测试,当前测试点是否位于当前控件区域(利用了函数返回值) if Result then LControl := AControl; end; end; begin LControl := nil; if AllowWinControls and (FWinControls <> nil) then for I := FWinControls.Count - 1 downto 0 do if GetControlAtPos(FWinControls[I]) then Break; if (FControls <> nil) and (LControl = nil) then for I := FControls.Count - 1 downto 0 do if GetControlAtPos(FControls[I]) then Break; Result := LControl; end;