MFCのいくつかの関数の違い


GetMessagePos GetCursorPosの違い
 
The GetMessagePos function retrieves the cursor position for the last message retrieved by the GetMessage function.
The
GetCursorPos function retrieves the cursor's position, in screen coordinates.
上の明らかな違いがわかります.
GetMessagePosのマウスの位置はメッセージキューから取られ、
GetCursorPosは直接取ります.
 
 
LOWORD,HIWORDとGET_X_PARAM, GET_Y_PARAMの違い
LOWORD,HIWORDとGET_X_PARAM, GET_Y_PARAMの違い
今日ドラッグ&ドロップ機能を書いたとき、変な問題に遭遇しました.ドラッグアンドドロップは、元のウィンドウの正の方向、すなわち右下にのみドラッグ&ドロップできます.左上にドラッグ&ドロップしてもダメなので、いろいろ考えてみると、自分が使っているHIWORD、LOWORDの問題です.
#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))
#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))
typedef unsigned short WORD ;
 
見れば、LOWORD、HIWORDは負の値を失う現象がある.
#define GET_X_LPARAM(lp)                        ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp)                        ((int)(short)HIWORD(lp))
 
この2つのマクロは、HIWORD,LOWORDを用いるとともに、数値タイプ変換を行い、数値の正確さを保証する.
 
WM_のような処理をするという教訓が得られましたLBUTTONDOWN , WM_LUTTONUPのようなメッセージは、LOWORD、HIWORDのようなマクロを使用しないでください.
マウスの位置は正負可能である.
Cardinalは4バイトの符号なしの整数型で、まず例数を見てみましょう.
4277991664
4バイト目3バイト目2バイト目1バイト目
11111110 11111100 11111000 11110000
FE FC F8 F0
254 252 248 240
上位2位下位2位
1111111011111100 1111100011110000
FEFC F8F0
65276 63728
Cardinal例数:
バイト単位:
バイナリ:
16進数:
10進数:
2バイト単位で分割:
バイナリ:
16進数:
10進数:
//    Lo          (        )
const
  c: Cardinal = 4277991664;
begin
  ShowMessageFmt('%d', [Lo(c)]); {240}
end;

  
// Lo , Byte const c: Cardinal = 4277991664; begin ShowMessageFmt('%d', [Byte(c)]); {240} end;
//Hi , const c: Cardinal = 4277991664; begin ShowMessageFmt('%d', [Hi(c)]); {248} end;
// , LoWord ; , , Word . const c: Cardinal = 4277991664; begin ShowMessageFmt('%d', [LoWord(c)]); {63728} ShowMessageFmt('%d', [Word(c)]); {63728} end;
//HiWord const c: Cardinal = 4277991664; begin ShowMessageFmt('%d', [HiWord(c)]); {65276} end;
えば、マウスメッセージのメッセージパラメータlParamにマウスの が されている.lParamは4バイトで、その い2ビットはxを して、 い2ビットはyを します
 
 pt.X := LoWord(lParam);
{lParamの 2 はx }
  pt.Y := HiWord(lParam);
{lParamの さ2 はy }
BYTE、WORDおよびDWORDタイプ
Visual C++6.0では、BYTEとWORD、DWORDは に なしの であり、WINDEFにある.Hで され、 のように される.
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef unsigned long       DWORD;
      
すなわちBYTEは しのchar (char は に1バイトの でもある)、WORDは しshort 、DWORDは しlong である.
   
      
,Visual C++6.0ではchar が1バイト,short が2バイト,intとlong がともに4バイトであるため,BYTEとWORD,DWORDで された はそれぞれ1バイト,2バイト,4バイトメモリを ており,BYTEとWORD,DWORDの りの と していると えられる.
   
すなわち、BYTE=unsigned char( に )
WORD=unsigned short( に )
DWORD=unsigned long( に )
GetFirstDocTemplatePositionとGetNextDocTemplate
GetFirstDocTemplatePosition
のドキュメントテンプレートの を り します.
POSITION GetFirstDocTemplatePosition( ) const;
り :オブジェクトポインタのクローンまたは に できるPOSITION .リストが の はNULLです.
コメント:
アプリケーションの ドキュメントテンプレートの を します.GetNextDocTemplateを び して されるPOSITION
CDocTemplateオブジェクトを します.
29、GetNextDocTemplate
ドキュメントテンプレートの を り し、 に できます.
CWinApp::GetNextDocTemplate
CDocTemplate* GetNextDocTemplate( POSITION& pos ) const;
り :CDocTemplateオブジェクトへのポインタ.
パラメータ:
Posは、GetNextDocTemplate or GetFirstDocTemplatePositionが すPOSITION の
.この は、 の び しで の に されます.
コメント:
posによって されたドキュメントテンプレートを し、posをPOSITION に します.GetFirstDocTemplatを うと
ePositionは の を し、GetNextDocTemplateループで に むことができます.
POSITION が であることを する があります. な は、MFCクラスライブラリのデバッグ のみ できます.
り したドキュメントテンプレートが の である 、posの しい はNULLに されます.
:
POSITION po = AfxGetApp()->m_pDocManager->GetFirstDocTemplatePosition();
 ((CDocTemplate*)(AfxGetApp()->m_pDocManager->GetNextDocTemplate(po)))->OpenDocumentFile(NULL);//
のdocumentTemplateの