Visual C++ 2011-07-18
2011-07-19 19:40 Clingingboy 阅读(659) 评论(0) 编辑 收藏 举报
一.Keyboard Accelerators控件快捷键
参考:http://blog.csdn.net/Welson80/article/details/5808277
http://www.cnblogs.com/zengcan/archive/2010/01/25/1655908.html
相关函数:
LoadAccelerators
TranslateAccelerator
二.WSARecvDisconnect && WSASendDisconnect
http://baike.baidu.com/view/567695.htm
http://baike.baidu.com/view/569168.html
三.判断Window
- IsWindow The IsWindow function determines whether the specified window handle identifies an existing window.
- IsWindowEnabled The IsWindowEnabled function determines whether the specified window is enabled for mouse and keyboard input.
- IsWindowVisible The IsWindowVisible function retrieves the visibility state of the specified window.
四.ATL宏
1.OBJECT_ENTRY_AUTO
指定一个COM可创建类,通常表示类从CComCoClass继承
2.DECLARE_OBJECT_DESCRIPTION
自定COM类描述
3.UpdateRegistry方法
用于注册类信息到注册表中,用4个宏表示
3.1 DECLARE_NO_REGISTRY空实现.表示COM类不注册
3.2 DECLARE_REGISTRY 旧版本使用
3.3 DECLARE_REGISTRY_RESOURCE && DECLARE_REGISTRY_RESOURCEID 使用脚本资源
五.RGS脚本
[NoRemove | ForceRemove | val] Name [ = s | d | m | b 'Value'] { ... optional script entries for subkeys }
ForceRemove表示当发生变更时则强制删除,NoRemove则刚相反
val表示键名,s | d | m | b表示键值类型.下面是一个例子
HKCR表示注册表根路径(HKEY_CLASSES_ROOT)
HKCR
{
ForceRemove DuckDoer.DuckDoer.1 = s 'DuckDoer Class'
{
CLSID = s '{120B72A0-65BF-11D0-9DDC-00A0C9034892}'
}
ForceRemove DuckDoer.DuckDoer = s 'DuckDoer Class'
{
CurVer = s 'DuckDoer.DuckDoer.1'
}
NoRemove CLSID
{
ForceRemove {120B72A0-65BF-11D0-9DDC-00A0C9034892} = s 'DuckDoer Class'
{
ProgID = s 'DuckDoer.DuckDoer.1'
VersionIndependentProgID = s 'DuckDoer.DuckDoer'
LocalServer32 = s '%MODULE%'
}
}
}
六.脚本变量
%MODULE%在被调用时会被GetModuleFileName方法替换
自注册变量,重写AddCommonRGSReplacements方法
HRESULT AddCommonRGSReplacements(IRegistrarBase *pRegistrar) {
BaseModule::AddCommonRGSReplacements( pRegistrar );
OLECHAR wszDate [16]; SYSTEMTIME st;
GetLocalTime(&st);
wsprintfW(wszDate, L"%.4d/%.2d/%.2d", st.wYear,
st.wMonth, st.wDay);
pRegistrar->AddReplacement( OLESTR("INSTALLDATE"), wszDate );
}
替换部分变量,可以在UpdateRegistry方法中手动调用UpdateRegistryFromResource(本来由DECLARE_REGISTRY_RESOURCEID宏自动完成)方法
static HRESULT WINAPI UpdateRegistry(BOOL b) {
OLECHAR wszDate [16]; SYSTEMTIME st;
GetLocalTime(&st);
wsprintfW(wszDate, L"%.4d/%.2d/%.2d", st.wYear,
st.wMonth, st.wDay);
_ATL_REGMAP_ENTRY rm[] = {
{ OLESTR("INSTALLDATE"), wszDate},
{ 0, 0 } };
return _pAtlModule->UpdateRegistryFromResource(
IDR_DEMAGOGUE, b, rm);
}
七.组件类别
// {0D22FF22-28CC-11d2-ABDD-00A0C9C8E50D}
static const GUID CATID_ATLINTERNALS_SAMPLES =
{0xd22ff22, 0x28cc, 0x11d2, {0xab, 0xdd, 0x0, 0xa0, 0xc9, 0xc8,
0xe5, 0xd}};
BEGIN_CATEGORY_MAP(CDemagogue)
IMPLEMENTED_CATEGORY(CATID_ATLINTERNALS_SAMPLES)
END_CATEGORY_MAP()
八.ATL调试宏
- ATLASSERT下断点
- AtlTrace输出Debug视窗 即内部调用了OutputDebugString
- AtlTrace2参数更多,可以分类别输出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2006-07-19 一个类控制不同种类控件的同时启用或停用