日期:2014-05-20 浏览次数:20833 次
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
------解决方案--------------------
Petzold 之 Programming Windows Fifth Edition 那么厚的一本书.
不是 3 言 2 语就说清楚的.
简化的在线教程让我来给你推荐一下:
1.
theForger's Win32 API Tutorial
http://www.winprog.org/tutorial/
2.
Win32 Tips, Tricks and Tutorials
http://www.catch22.net/tuts
3.
Stromcode Win32/C++
http://www.stromcode.com/category/code/
4.
A programming tutorials on C++ language, C language, MFC Windows
http://www.tenouk.com/
其他的 FunctionX, DevX, codeproject, codeguru 就不列了.
------解决方案--------------------
楼主啊……
前面的问题就不说了。
至于为什么不添加控件就不显示的问题,是因为,没有画上去。
控件,包括窗体,都有回调函数 OnPaint 方法,你一定没有接触过,这个是 WM_PAINT 消息的回调方法的外包装,你说得没错,消息循环是内部给处理好的了,先不说C#.net,便是MFC,你去创建一个UI线程,消息循环也是替你照顾好的。
UI的话,有一个结构,叫做“视觉树”,这是一个迭代过程,只有加入“树”中的元素才会递归地去显示到UI上。你新生成一个控件,但是你不将之加入到该“树”中,你当然看不到。因为,它被UI给忽略了,但它还是在内存中存在着。
我觉得你借着这个兴趣,应该去看看底层。.net也是一个体系,它也有底层。
------解决方案--------------------
我来终结这个帖子吧
就mfc窗口程序来说,
1. 给C***App填上虚拟函数 virtual BOOL PumpMessage();
填上代码:
BOOL CTestmfcApp::PumpMessage()
{
ASSERT_VALID(this);
if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))
{
return FALSE;
}
if (m_msgCur.message==WM_ENDSESSION) {
AfxMessageBox("WM_ENDSESSION");
}
if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur))
{
::TranslateMessage(&m_msgCur);
theGroup++; // 这个为全局变量,只在这里被增加!
// 这个是输出函数,将消息利用OutputDebugString打印到 Dbgview.exe里面
// 格式自己定义,theMSGSTR 为一个类,里面封装了 消息字符串到消息值的映射
// 将消息的个数 theGroup 也打印出来