⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messagetarget.cpp

📁 Last change: 2008-02-03 This is the source code of KCeasy。
💻 CPP
字号:
/*
This file is part of KCeasy (http://www.kceasy.com)
Copyright (C) 2002-2004 Markus Kern <mkern@kceasy.com>

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
*/
//---------------------------------------------------------------------------
#pragma hdrstop
#include "MessageTarget.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------

// global window proc

LRESULT CALLBACK GlobalWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    TMessageTarget* MessageTarget = (TMessageTarget*)::GetWindowLong(hwnd,GWL_USERDATA);
    LRESULT Result;

    if(MessageTarget) {
        if(MessageTarget->WindowProc(hwnd,uMsg,wParam,lParam,Result))
            return Result;
    }

    return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
}

// class TMessageTarget

TMessageTarget::TMessageTarget(const char* WindowClass, const char* WindowName)
:   HandlerList(NULL)
{
    // register window class
    WNDCLASS WndClass;
    memset(&WndClass,0,sizeof(WndClass));
    WndClass.lpfnWndProc = GlobalWindowProc;
    WndClass.lpszClassName = WindowClass;
    WndClassAtom = ::RegisterClass(&WndClass);

    // create window
    WndHandle = ::CreateWindow((char*)WndClassAtom,WindowName,0,0,0,0,0,NULL,NULL,NULL,NULL);
    ::SetWindowLong(WndHandle,GWL_USERDATA,(LONG)this);

    HandlerList = new TList();
}

TMessageTarget::~TMessageTarget()
{
    // destroy window
    ::DestroyWindow(WndHandle);

    // unregister window class
    ::UnregisterClass((const char*)WndClassAtom,NULL);

    HandlerList->Pack();
    for(int i=0; i<HandlerList->Count; i++)
        delete HandlerList->Items[i];
    delete HandlerList;
}

void TMessageTarget::AddHandler(unsigned int MsgId, TMessageTargetHandler Handler)
{
    HandlerList->Add(new THandlerData(MsgId, Handler));
}

bool TMessageTarget::WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT &Result)
{
    if(hWnd != WndHandle)
        return false;

    for(int i=0; i<HandlerList->Count; i++) {
        THandlerData* Data = (THandlerData*)HandlerList->Items[i];
        if(Data->MsgId == uMsg) {
            TMessage Msg;
            Msg.Msg = uMsg;
            Msg.WParam = wParam;
            Msg.LParam = lParam;
            Msg.Result = 0;
            Data->Handler(Msg);
            Result = Msg.Result;
            return true;
        }
    }
    
    return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -