① 分享WINDOWS编程学习方法和书籍(最佳答案200分)
如果想踏踏实实的学习WINDOWS编程,那么建议你从Windows API(SDK)编程开始学起,这样你可以很透彻的学习windows编程的原理,例如消息传递机制等等。
学好了Windows SDK编程,可以再看看MFC编程就简单多了。
SDK编程入门书籍可以看:
中文版:《Windows 程序设计(第5版)》
英文版:《Programming Windows (Fifth Edition) 》
【原出版社】 Microsoft Press
【作 者】(美)Charles Petzold
【译 者】 北京博彦科技发展有限责任公司
【丛 书 名】 Microsoft 程序设计系列
【出 版 社】 北京大学出版社
【书 号】 730104187X
这本书的中英文电子版都可以在网上找到,你可以上网搜搜对它的评价!
http://www.china-pub.com/2382
更深入的学习可以看《windows核心编程》,MFC方面的可以看《深入浅出MFC》。
② wtl编程怎么打开界面设计
你不能用MFC的编程方式,去找WTL的消息映射。因为WTL不被微软官方支持,所以VS里不推荐用手动添加。直接找BEGIN_MSG_MAP下的就可以了。如下段代码:
BEGIN_MSG_MAP(CLoginDlg)
MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)
COMMAND_ID_HANDLER(IDOK,OnOK)
COMMAND_ID_HANDLER(IDC_LOGIN,OnOK)
REFLECT_NOTIFICATIONS()
END_MSG_MAP()
③ c++ 的 stl windows sdk mfc wtl 这几个部分应该怎么学习啊
1.打牢C++的语言基础。
2.STL是C++的标准库,基于模板技术,结合泛型设计思想,是一套学习C++本身的很好的库,但需要很好的C++语言功底。在一般的C++书籍中,都会有STL的章节,不过一般只是讲如何应用它。在学习数据结构的时候,结合STL来学习容器和算法,再好不过,推荐书籍《STL源码剖析》(侯捷),如果你觉得需要掌握更深层次的模版技术并加强对模版的正确认识和了解,请看《C++ Templates中文版》。
3.对于windows sdk,你可以看《windows 程序设计》(Charles Petzold),里面的例子全是用C写就的,有了C/C++的基础,这些例子都很简单。跟着书本循序渐进,你会获益良多。接下来,你可以看《windows核心编程》(Jeffrey Richter),里面有很多高级技术,例子也用C++写成。读完这两本书,你对windows环境下的编程就有了清晰的了解。
4.对于MFC,有了第三部的积累,小菜一碟。前提是第三部分你要掌握的非常良好。如果你初读《MFC深入浅出》(侯捷),你可能会觉得有所困难,不过不要泄气,硬着头皮也要学完前几章,待到你把前几章弄通后,哈,后面的就很容易学下去了,而且充满乐趣(对我而言是如此的)!
5.WTL,一个非常棒的Frame。你学好了模板,再结合你对MFC的了解,学习WTL再简单不过了。WTL最好的一个地方在于,它是基于模版和多重继承实现的。由于模版的特性,WTL所有的源代码都在头文件中,这些源码正是学习WTL的最好方法。到了这个阶段,你会觉得,看WTL源代码是一件颇为享受的事情,因为你得以一窥它是如何实现与MFC同名的一些函数的。自然,这里有一本书(其实不能算书,是Code Project上的一系列文章的集合),叫做《WTL for MFC programmer》,有中文版。
关于其它,对于windows的高级技术COM/COM+,已经不是现今的主流技术了,《COM本质论》的作者也说在.net大行其道的今天,COM已经没落了,但现在windows的很多关键部分仍在应用COM,谷歌地球的自定义编程也是COM方面的内容。简单来说,COM是基于二进制防火墙的跨平台的技术,内容繁杂,你可以先看《COM技术内幕》,再看《COM本质论》,如果你感兴趣的话。我当时光看COM中的聚合,就搞得头大。
学完COM,你能干什么呢?还不到时候。接下来就到ATL(活动模板库)了,它是基于COM的框架。具体的内容我也没怎么学,我倒是买了本《ATL技术内幕》,留待以后学习吧。
抛开windows,但看C++本身,有很多有趣的东西。我首推《C++模板元编程》,这是一本考验耐性和智力的书。同时你必然就接触到了Boost库,这个库的名气很大,我就不赘述了。如果你有兴趣,可以看看脚本语言与C++的混合编程(仅是个人推荐,看你兴趣),其中之一就是Boost::Python和C++的混合编程(当然,Python是一种独立的脚本语言,Boost::Python只是用于C++编程的)。
还有什么呢,还是模板,依旧是泛型编程。先提一个项目,“大芒果”,魔兽世界的网络变“单机”的服务器。里面应用到了很多这本书介绍的技术:《C++设计新思维-泛型编程与设计模式之应用》。当然,对于这么大一个项目,这只是冰山一角。
还有吗?当然,数之不尽……
④ vc打开多个图片 然后点击按钮显示下一张 或上一张
PictureControl就是类CStatic,下面是VC++ WTL的编程用法,你着重看下WM_PAINT及设置图片的函数就能知道,如何用在MFC里了。关于Load图片的函数AtlLoadGdiplusImage(nRes, pstrType),我没贴出来,主要是为了方便你了解。
当你切换图片时,就调用SetBitmap(HBITMAP hBitmap)函数,就可以切换图片了。SizeToFit()函数是根据你设定的图片,自动调整控件窗口大小。
#ifndef _THEMEDIMAGE_H_INCLUDE_
#define _THEMEDIMAGE_H_INCLUDE_
#pragma once
//////////////////////////////////////////////////////////////////////
// Themed Image control
//
class CThemedImageCtrl : public CWindowImpl<CThemedImageCtrl, CStatic>
{
public:
CWindow m_wndThemeParent;
CBrush m_brBack;
CBitmap m_bmpImage;
// Operations
BOOL SubclassWindow(HWND hWnd)
{
ATLASSERT(m_hWnd==NULL);
ATLASSERT(::IsWindow(hWnd));
BOOL bRet = CWindowImpl<CThemedImageCtrl, CStatic>::SubclassWindow(hWnd);
if( bRet ) Init();
return bRet;
}
void Init()
{
m_wndThemeParent = GetParent();
Invalidate();
}
void SetThemeParent(HWND hWnd)
{
ATLASSERT(::IsWindow(hWnd));
m_wndThemeParent = hWnd;
if( !m_brBack.IsNull() ) m_brBack.DeleteObject();
}
void SetBitmap(HBITMAP hBitmap)
{
m_bmpImage = (HBITMAP) ::CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
if( IsWindow() ) Invalidate();
}
void SetBitmap(UINT nRes, LPCTSTR pstrType)
{
m_bmpImage = AtlLoadGdiplusImage(nRes, pstrType);
if( IsWindow() ) Invalidate();
}
void SizeToFit()
{
ATLASSERT(!m_bmpImage.IsNull());
BITMAP BmpInfo = { 0 };
m_bmpImage.GetBitmap(&BmpInfo);
ResizeClient(BmpInfo.bmWidth, BmpInfo.bmHeight);
if( IsWindow() ) Invalidate();
}
// Message map and handlers
BEGIN_MSG_MAP(CThemedImageCtrl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
MESSAGE_HANDLER(WM_MOVE, OnSize)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
END_MSG_MAP()
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
Init();
bHandled = FALSE;
return 0;
}
LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
if( !m_brBack.IsNull() ) m_brBack.DeleteObject();
return TRUE;
}
LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return 1;
}
LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
if( wParam != NULL )
{
DoPaint((HDC) wParam);
}
else
{
CPaintDC dc(m_hWnd);
DoPaint(dc.m_hDC);
}
return 0;
}
// Implementation
void DoPaint(CDCHandle dc)
{
CRect rcClient;
GetClientRect(&rcClient);
// Preserve background
if( m_brBack.IsNull() ) m_brBack = AtlGetBackgroundBrush(m_hWnd, m_wndThemeParent);
HBRUSH hOldBrush = dc.SelectBrush(m_brBack);
dc.PatBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), PATCOPY);
dc.SelectBrush(hOldBrush);
// Paint image (assume that it is a 32bit with alpha-pr-pixel)...
CDC dcCompat;
dcCompat.CreateCompatibleDC(dc);
BITMAP BmpInfo = { 0 };
m_bmpImage.GetBitmap(&BmpInfo);
BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
HBITMAP hOldBitmap = dcCompat.SelectBitmap(m_bmpImage);
dc.AlphaBlend(0, 0, rcClient.Width(), rcClient.Height(), dcCompat, 0, 0, BmpInfo.bmWidth, BmpInfo.bmHeight, bf);
dcCompat.SelectBitmap(hOldBitmap);
}
};
#endif //_THEMEDIMAGE_H_INCLUDE_
⑤ WTL高手进!高分!
就当SDK编程用就可以了, 只是一些繁琐的功能通过模板继承来简化了
但是vs没有提供像样的class wizard, 你可以配合Visual FC辅助进行开发.
另外codeproject上有很多开源代码, 也有给mfc程序员写的wtl入门教程, 可以参考一下. 多做几个小项目练练手就可以了, 既然楼主有基础, 相信通过实践动手很快就可以入门的~
但是COM技术是nt系列核心技术之一, 还是建议有时间你好好学一下, 俗话说磨刀不误砍柴工, 你说对吧
⑥ 如何在WTL和MFC中使用ilib及如何静态使用ilib库
现在把我在实现过程中遇到的问题及解决方法列举一下 以便大家以后遇到问题的时候做一个参考。
1.我喜欢用静态库,不喜欢用动态库,用动态库就好像穿衣服还要随身携带衣架一样,多余还麻烦。
所以在用这个库的时候 第一件事就是把动态库变成静态库。还有改用成 unicode字符集
(1).找到uilib.h头文件 注释掉原有的定义:添加新的宏 #define UILIB_API
//#ifdef UILIB_EXPORTS
//#define UILIB_API __declspec(dllexport)
//#else
//#define UILIB_API __declspec(dllimport)
//#endif
(2)编译后不会报错,然后 在使用时就可以直接包含这个静态库了 同时要注意一点 还需要包含 几个静态库oledlg.lib i.lib winmm.lib comctl32.lib
虽然也不简单,但是却可以让程序生成后 只有一个exe 也没有其他累赘。
2. 包含之后 编译工程 会报错createtextserver没有定义什么的。这个是因为新版本中加入了richedit支持,这个directui的 需要用到 texthost和textserver 这时候 需要引用richedit.dll和richedit.lib 为了方便,我把这部分的导入 放到了ilib库里面了。 至于是什么代码我就不贴了 导入库的代码 是个程序员就会了。
3.如果你的wtl ATL MFC文件已经包含了 atltypes之类的头文件,那你会发现会出N多的 crect cpoint csize等 说不知道用哪个。因为ilib自己实现了这三个函数 和ATL MFC WL里面的冲突了。那么这时候怎么办呢?.. 当然是用宏了,我们在ilib的 uibase.h下面可以找到他们定义 在定义前加#ifndef DUI_NOTYPES 定义后追加 #endif 这样我们在WTL中引入ilib库的时候 引用前加入 #define DUI_NOTYPES 就可以屏蔽掉那些错误了。
4. 接下来的问题 都快让我崩溃了,不过最后还是解决了。
在前面问题逐一解决之后 你会发现 项目里的很多地方都莫名其妙的报错了,甚至连最基本的 CDC CmemeryDC Cpen什么的都不认了 报一堆错误。
错误原因在于ilib里面的 windowsx.h头文件,这个是sdk编程人员不可能不知道的头文件了,里面是一些宏的定义,大大的方便了sdk编程。
而在这里却成了阻碍,那么怎么办呢? 我看了下报错的地方 又看了下windowsx里面宏,发现其实原因很简单,里面的一些宏定义和WTL的函数定义冲突了。那么这个时候 我们需要使用微软的 函数保护机制了。在我的项目中有冲突的是下面几个函数 SelectFont SelectPen 其实还有很多 selectbrush等。报什么错就加什么 没有必要一次加齐。
#ifdef _INC_WINDOWSX
#undef SelectFont
#undef SelectPen
#endif // _INC_WINDOWSX
5.那么到这个时候就可以正常的在WTL中使用ilib库了。
6.那么我们来说说 那棵树的实现。
树无疑 就是里面的list靠缩进实现了。节点我选择用以下模式做的。这样后面排序的时候 我只需要交换CHorizontalLayoutUI就可以了 而无须改变
CListContainerElementUI 索引号了。
CListContainerElementUI
CHorizontalLayoutUI
控件
控件
CHorizontalLayoutUI
CListContainerElementUI
7.自动计算下滚动条,
CListContainerElementUI 没有自动计算下滚动条的功能,可能是因为是容器 里面的东西多少位置之类的都无法确定吧。
我的项目为了针对我这个项目 我在CHorizontalLayoutUI 插入了Ctextui 在底层库里面加入自动计算Ctextui 的宽度并设置CListContainerElementUI 宽度的逻辑就可以了
在这个过程总需要注意CListContainerElementUI 的setfixwight 有刷新的 会导致死循环 所以要加一个默认参数。
8.排序 排序就不多说的 原理比较简单 一个快速排序,然后 颠倒CHorizontalLayoutUI和 tag就可以了、我的快排写的 比较麻烦好像 因为当时比较着急 写的时候比较乱 不过还可以 至少实现功能了,但是目前只是叶子节点排序,如果想实现非叶子节点排序也不是不可以,但是会比较麻烦 因为我也不用 就没写,有兴趣的自己写下吧。
demo真是非常之简单,只有一个treeviwe 其他的什么都没有.连标题栏什么都没写 那些我相信大家很简单的就能写出来。我把demo放到csdn上 想看的下载吧 。转载。
⑦ 在WTL和MFC中,如何知道一个控件的状态是显示(SW_SHOW)还是隐藏呢(SW_HIDE)
BOOL IsWindowVisible(HWND hWnd);
⑧ WTL编程问题
这和WTL没关系吧?你的只是构造函数,声明变量,然后再进行初始化,出了问题。
这有我写的一个WTL 时钟程序,你对比下看看。
⑨ 如何学习Windows编程
很多人从MFC开始学习,结果常常是一头雾水,知难而退;也有人毅力坚强,熬过了MFC的阵痛期,最后却是知其然而不知其所以然,并且思维被限制在MFC的框架之中,遇到稍微有点规模的程序就无从下手了。
以我个人的这些年的Windows开发经历,我建议Windows上的学习路线如下:
首先当然是语言的学习,比如C或C++(STL),它是平台无关的
然后可以从《Windows程序设计》(by
Charles Petzold
)入门,从最原始的Windows API开始学习
接下来可以学习《Windows核心编程》(by
Jeffrey Richter
), 它会让你比较深刻的理解Windows的前台和后台机制
学完上面2本书,对Windows系统已经比较熟悉了,再要深入的话可以学下《Windows 图形编程》(by 袁锋)。
至此,已经可以用API的方式开发大部分Windows应用程序了,
接下来可以学一些常用库,比如MFC,WTL,ATL等,此时学习MFC和一开始就学习MFC已是截然不同的感觉,彼时痛苦难熬,此时会心一笑。
其他就是根据项目需要,专业知识的学习,比如COM技术,网络,D3D等。