2012-05-26 120 views
3

一個標準窗口過程函數借此原型:傳遞額外的wParam/lParam參數?

LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 

當消息如WM_MOUSEMOVEWM_CHAR,所述WndProc函數將接收該消息源自的窗口中,並且任何額外的參數,這將是與MSG和wParam中/ lParam的。

我現在有一類。說

class Random 
{ 
    public: 
     void Initialize(); 

    private: 
     void Draw(); 
     HWND hWnd; 

    friend LRESULT CALLBACK RandomProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 
}; 

hWnd之後,通過Initialize()初始化和創建的,它會發送消息,如WM_LBUTTONDOWNRandomProc。一旦收到消息,我希望RandomProc使用Draw()重繪類Random的窗口。

的事情是,我將有多個Random變量,而且每次都會有一個窗口。所有窗口將發送消息到RandomProc,並希望它重新繪製hWnd的相應窗口。我不知道哪個隨機變量根據hWnd參數或msg/wParam/lParam發送了消息,因此無法訪問相應的Draw()函數並且無法重繪正確的窗口。

有沒有辦法每一條消息發送或有另一種方式來訪問隨機類,它的hWnd發送消息時的指針傳遞給類窗口的程序?

+1

消息旨在以每個窗口爲基礎發送。你的'hWnd'參數是什麼?如果您希望窗口使用相同的過程,請讓它們使用相同的類,或者爲您使用的每個Windows類指定相應的過程。 – chris

+0

就我而言,這些類有點像「按鈕」。我需要宣佈其中幾個。它們都具有相同的過程,因爲它們都是相同類型的「按鈕」,但我希望它們位於單獨的類中,以便輕鬆控制和聲明按鈕。有沒有辦法做到這一點? – GILGAMESH

+0

但並不是每個按鈕都有相同的'HWND'。這就是你通常將他們分開的方式。用'HWND'繪製'有一個大問題嗎? – chris

回答

6

你不找GetWindowLongPtr/SetWindowLongPtr功能?

此函數分配/從窗口句柄中檢索任意指針/。您可以將指向您的Random類實例的指針分配給您創建的每個窗口。在RandomProc中,您只需使用GetWindowLongPtr並將指針投射到Random*

正如克里斯說,在評論中,使用GWLP_USERDATA屬性分配的指針。

+2

有用的將是'GWLP_USERDATA'放入你自己的數據來區分。 – chris

+0

謝謝,你們倆!我認爲它現在有效。 – GILGAMESH