日期:2014-05-20 浏览次数:20996 次
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 也打印出来