ウィンドウハンドルオブジェクトのマッピング(回転)


作者:translated by zhkza 99 c
話題導入:C言語時代、純粋なCを使ってwindowsアプリケーションを開発したとき、ウィンドウハンドルHWNDで【HWNDはWNDのメモリハンドルであり、WNDはWindowsは内部のプライベートデータ構造であり、ウィンドウに関する情報:サイズ情報、タイトル情報などが記憶されている.一般的に開発者はこのデータ構造にアクセスできないが、HWNDをパラメータとしてwindowsのAPI関数を呼び出すことができる.例えば:GetWindowRect、GetWindowTextなど、ウィンドウに関するアクセスを得ることができる.】を選択します.MFCクラスはC++クラスメカニズムであり,MFCのクラスはC++のオブジェクトメソッドによりウィンドウのハンドルをカプセル化する.ウィンドウハンドル(Windowsオブジェクト)からMFCにおけるC++ウィンドウオブジェクト(MFCオブジェクト)へのマッピングメカニズムが存在し,HWNDとC++オブジェクトとの双方向コミュニケーションを保証し,プログラム設計の新しいモードを切り開いた.ハンドルマッピングメカニズムには、主に2つのクラスハンドルマッピング補助クラス、モジュール、スレッド状態クラスが含まれます.参考書『MFCウィンドウプログラム設計姚領田、高守伝中国水利水力発電出版社』第1章WindowsウィンドウとCwnd対象.
このメモは、ウィンドウのオブジェクトハンドルからC++オブジェクトへのマッピングをサポートするMFCのルールを記述しています.に質問
ウィンドウオブジェクトは通常HANDLEsで表され、MFCのクラスはC++のオブジェクトメソッドでウィンドウのハンドルをカプセル化する.MFCクラスライブラリのハンドルパッケージング関数は、特殊なハンドルパッケージングウィンドウオブジェクトをC++オブジェクトにする方法を提供し、多くの場合、ウィンドウのオブジェクトはC++のパッケージングオブジェクトを持たないが、C++パッケージング対象の役割として一時的なオブジェクトが確立されることが多い.The Windows objects that use handle maps are:ハンドルマッピングを使用するウィンドウオブジェクトは次のとおりです.
  • HWND(CWnd and CWnd-derived classes)/WndクラスはHWNDをカプセル化し、ウィンドウハンドルHWNDからMFCクラスオブジェクトCWndへのマッピング/
  • が存在する.
  • HDC(CDC and CDC-derived classes)/同理CDCパッケージHDC、存在/
  • HMENU (CMenu)
  • HPEN (CGdiObject)
  • HBRUSH (CGdiObject)
  • HFONT (CGdiObject)
  • HBITMAP (CGdiObject)
  • HPALETTE (CGdiObject)
  • HRGN (CGdiObject)
  • HIMAGELIST (CImageList)
  • SOCKET (CSocket)

  • HWNDはWNDのメモリハンドル、フォームハンドル、WNDはWindowsの内部プライベートデータ構造であり、ウィンドウに関する情報:寸法情報、タイトル情報などが格納されている.一般に開発者はこのデータ構造にアクセスできないが,HWNDをパラメータとしてwindowsのAPI関数,例えばGetWindowRect,GetWindowTextなどを呼び出してアクセスを得ることができる.
    HDCはデバイス記述テーブルデバイス記述テーブルには、ディスプレイのサイズや解像度、現在選択されているブラシ、ブラシ、フォントなどのGDIオブジェクトの情報が記録されています.HDCは、ディスプレイの表示、プリンタの表面など、デバイスの表面として理解できます.このHDCを用いてこれらの表示に図形を描画する--多くのGDI図形描画関数は、このHDCをパラメータとして使用する必要がある.
    HMENUはメニューハンドルです.HPENはブラシハンドルです.HBURUSHブラシハンドル.HFONTフォントハンドル.HBITSMAPビットマップハンドル.HPALETTEパレットハンドル.HRGN領域ハンドル.
                 ,     MFC                       FromHandle    。  ,      hWnd HWND  
    CWnd::FromHandle(hWnd)
    は、hWndをカプセル化したCWndを指すポインタを返します.hWndが明確なオブジェクトを生成しない場合、一時的なCWndが作成され、hWndがカプセル化されます.これにより、任意のハンドルを介して有効なC++オブジェクトを得ることが可能になります.
    カプセル化されたオブジェクトがあれば、共有メンバー変数でハンドルを得ることができます.CWndの場合、m_hWndはこのオブジェクトのHWNDハンドルを含む.Attaching Handles to MFC Objects
    新しく作成されたカプセル化されたハンドルオブジェクトとウィンドウオブジェクトを指すハンドルが知られています.この2つをAttachを呼び出すことで関連付けることができます.例:


    CWnd myWnd; myWnd.Attach(hWnd);

    これは、myWndとhWndを永久的に関連付けたマッピングであるプロジェクトを構築します.CWnd::FromHandle(hWnd)を呼び出すとmyWndを指すポインタが返されます.myWndが削除されると、構造関数は自動的にウィンドウ関数DestroyWindowを介してhWndを破棄します.そうしたくない場合は、hWndはmyWndのオブジェクトが破棄される前にmyWndと分離しなければなりません.(通常myWnd定義の役割ドメインから離れている)メンバー関数Detachがこれらの作業を行います.
    myWnd.Detach();


    一時オブジェクト
    FromHandleがハンドルに付与されると、カプセル化されたC++オブジェクトが1つもなく、一時的なオブジェクトが生成されます.これらの一時的なオブジェクトは、ハンドルから分離され、DeleteTempMap関数を呼び出すことによって削除されます.デフォルトでは、OnIdle時刻CWinThreadはDeleteTempMapを自動的に呼び出し、各クラスが一時的なハンドルマッピングをサポートします.これは、一時オブジェクトを指すポインタが、そのポインタを取得する関数が終了しても有効であると仮定することはできません.Windowsメッセージサイクルの空き時間という一時オブジェクトが削除されます.オブジェクトとマルチスレッドのカプセル化
    テンポラリオブジェクトと永続オブジェクトは、それぞれのスレッドの基礎である、すなわち、1つのスレッドが他のスレッドのC++オブジェクトにアクセスすることができず、テンポラリオブジェクトでも永続オブジェクトでも、前述のようにスレッドがOnIdleに入る.ステータスのときに一時的なオブジェクトが削除されます.これらのオブジェクトは通常、独自のHANDLEタイプを使用します.C++カプセル化されたオブジェクトは、通常、異常を引き起こすことがあります.