《深入浅出MFC》笔记(四)

简介:
#define HIGHEST_THREAD    0x00
#define ABOVE_AVE_THREAD  0x3F
#define NORMAL_THREAD     0x7F
#define BELOW_AVE_THREAD  0xBF
#define LOWEST_THREAD     0xFF
#define SLEEPDELAY        1
#define FORLOOPDELAY      2
#define NODELAY           3

HWND hWnd;
HANDLE _hThread[5];
UINT   _uDelayType=NODELAY;//类型

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    int    i;
    DWORD  ThreadID[5];
    static HMENU  hMenu;
    static HANDLE hMasterThread;
    static DWORD  ThreadArg[5] = {HIGHEST_THREAD,    // 0x00
                                  ABOVE_AVE_THREAD,  // 0x3F
                                  NORMAL_THREAD,     // 0x7F
                                  BELOW_AVE_THREAD,  // 0xBF
                                  LOWEST_THREAD      // 0xFF
                                 };
    switch (message)
    {
    case WM_CREATE:
        {
            hMenu = GetMenu (hWnd);
          hMasterThread = GetCurrentThread();
          SetThreadPriority(hMasterThread, THREAD_PRIORITY_HIGHEST);
          for(i=0; i<5; i++)  
              _hThread[i] = CreateThread(NULL,
                                        0,
                                        (LPTHREAD_START_ROUTINE)ThreadProc,
                                        &ThreadArg[i],
                                        CREATE_SUSPENDED,
                                        &ThreadID[i]);
          SetThreadPriority(_hThread[0], THREAD_PRIORITY_HIGHEST);
          SetThreadPriority(_hThread[1], THREAD_PRIORITY_ABOVE_NORMAL);
          SetThreadPriority(_hThread[2], THREAD_PRIORITY_NORMAL);
          SetThreadPriority(_hThread[3], THREAD_PRIORITY_BELOW_NORMAL);
          SetThreadPriority(_hThread[4], THREAD_PRIORITY_LOWEST);
        }
        break;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        case IDM_RESUME:      
            EnableMenuItem(hMenu, IDM_RESUME, MF_BYCOMMAND | MF_GRAYED);
            EnableMenuItem(hMenu, IDM_SUSPEND, MF_BYCOMMAND | MF_ENABLED);
            DrawMenuBar(hWnd);
            for (i=0; i<5; i++)
                ResumeThread(_hThread[i]);   
            return (0);
         case IDM_SUSPEND:  
            for (i=0; i<5; i++)
                SuspendThread(_hThread[i]);  
            EnableMenuItem(hMenu, IDM_SUSPEND, MF_BYCOMMAND | MF_GRAYED);
            EnableMenuItem(hMenu, IDM_RESUME, MF_BYCOMMAND | MF_ENABLED);
            DrawMenuBar(hWnd);
            return (0);
         case IDM_FORLOOP:    
            _uDelayType = FORLOOPDELAY;
            EnableMenuItem(hMenu, IDM_FORLOOP, MF_BYCOMMAND | MF_GRAYED);
            EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_ENABLED);
            EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_ENABLED);
            DrawMenuBar(hWnd);
            return (0);
         case IDM_SLEEP: 
            _uDelayType = SLEEPDELAY;
            EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_GRAYED);
            EnableMenuItem(hMenu, IDM_FORLOOP, MF_BYCOMMAND | MF_ENABLED);
            EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_ENABLED);
            DrawMenuBar(hWnd);
            return (0);
     case IDM_NODELAY: 
            _uDelayType = NODELAY;
            EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_GRAYED);
            EnableMenuItem(hMenu, IDM_FORLOOP, MF_BYCOMMAND | MF_ENABLED);
            EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_ENABLED);
            DrawMenuBar(hWnd);
            return (0);
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        {
             for(i=0; i<5; i++)
                 TerminateThread(_hThread[i], 0); 
            PostQuitMessage(0);
        }
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

VOID ThreadProc(DWORD *ThreadArg)
{
RECT rect;
HDC  hDC;
HANDLE hBrush, hOldBrush;
DWORD dwThreadHits = 0;
char  cBuf[80];
int   iThreadNo, i;
   GetClientRect (hWnd, &rect);
   hDC = GetDC (hWnd);
   hBrush = CreateSolidBrush(RGB(*(ThreadArg), *(ThreadArg), *(ThreadArg)));  // 跑て礶肅︹
   hOldBrush = SelectObject(hDC, hBrush);
   switch (*ThreadArg) {
     case HIGHEST_THREAD   : iThreadNo = 0; break;
     case ABOVE_AVE_THREAD : iThreadNo = 1; break;
     case NORMAL_THREAD    : iThreadNo = 2; break;
     case BELOW_AVE_THREAD : iThreadNo = 3; break;
     case LOWEST_THREAD    : iThreadNo = 4; break;
   }
   sprintf(cBuf, "T%d", iThreadNo);
   TextOut(hDC, *(ThreadArg), rect.bottom-150, (LPCWSTR)(LPCSTR)cBuf, strlen(cBuf));
   sprintf(cBuf, "P=%d", GetThreadPriority(_hThread[iThreadNo]));
   TextOut(hDC, *(ThreadArg), rect.bottom-130, (LPCWSTR)(LPCSTR)cBuf, strlen(cBuf));
   do
   {
     dwThreadHits++;      
     Rectangle(hDC, *(ThreadArg), rect.bottom-(dwThreadHits/10),
               *(ThreadArg)+0x40, rect.bottom);
  if (_uDelayType == SLEEPDELAY)
         Sleep(10);
     else if (_uDelayType == FORLOOPDELAY)
         for (i=0; i<30000; i++);
     else // _uDelayType == NODELAY)
         {   }
   } while (dwThreadHits < 1000);     
   hBrush = SelectObject(hDC, hOldBrush);   
   DeleteObject (hBrush);
   ReleaseDC (hWnd, hDC);
}

2.C++中的RTTI
#include <typeinfo.h>
#include <iostream>
using namespace std;
#include <string.h>

class graphicImage
{
protected:
    char name[80];
public:
    graphicImage()
    {
        strcpy(name,"graphicImage");
    }
    virtual void display()
    {
        cout << "Display a generic image." << endl;
    }
    char* getName()
    {
        return name;
    }
};
//----------------------------------------------------------------
class GIFimage : public graphicImage
{
public:
    GIFimage()
    {
        strcpy(name,"GIFimage");
    }
    void display()
    {
        cout << "Display a GIF file." << endl;
    }
};
class PICTimage : public graphicImage
{
public:
    PICTimage()
    {
        strcpy(name,"PICTimage");
    }
    void display()
    {
        cout << "Display a PICT file." << endl;
    }
};
//----------------------------------------------------------------
void processFile(graphicImage *type)
{
    if (typeid(GIFimage) == typeid(*type))
    {
        ((GIFimage *)type)->display();
    }
    else if (typeid(PICTimage) == typeid(*type))
    {
        ((PICTimage *)type)->display();
    }
    else
        cout << "Unknown type! " << (typeid(*type)).name() << endl;
}
void main()
{
    graphicImage *gImage = new GIFimage();
    graphicImage *pImage = new PICTimage();
    processFile(gImage);
    processFile(pImage);
}



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/01/19/1045794.html,如需转载请自行联系原作者
目录
相关文章
|
分布式数据库 Windows
|
消息中间件 程序员
进入MFC讲坛的前言(二)
MFC的WinMain   使用MFC编程的程序员刚开始都会提出这样一个问题:我的程序是从哪儿开始执行的?回答是:从WinMain()开始执行的。提出这样的问题是由于在他们所编写的MFC应用中看不到WinMain()函数。
820 0
|
前端开发 vr&ar C++
进入MFC讲坛的前言(五)
框窗、视图和文档及其关系   MFC架构的另外一个特色是它的框窗、视图和文档这个三位一体的结构,它是一个典型的MVC(Model、View and Controler)结构。严格的讲,框窗不属于MVC中的任何一项,MFC设计者将框窗加进来是为了能更好的协调文档 和视图。
786 0
进入MFC讲坛的前言(四)
MFC的消息映射机制   MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快。为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一。
896 0
进入MFC讲坛的前言(三)
MFC中的窗口创建及窗口消息映射 我经常碰到有人问我有关窗口创建的问题,他们经常把用HWND描述的系统窗口对象和用CWnd描述的MFC的窗口对象混淆不清。这两者之间是紧密联系在一起的,但是MFC为了自身的管理,在CWnd中加了一些额外的内容,包括如何从HWND生成CWnd。
921 0
|
消息中间件 程序员 开发工具
进入MFC讲坛的前言(一)
在这里,我想谈谈自己学习MFC的一些体会。我是从1997年才开始在Window下编写程序的。在这之前,我编写过一些DOS程序,包括一个简单的全屏幕编辑器和一个带函数的表达式解释器,都是一些小的程序。Window 3.1流行后,我开始在它下面编写程序。
930 0