VCネタ

さて、ランチャー。
ランチャーの動きとして欲しいのは、
「ファイルをランチャーにD&Dで落としてボタンを登録」
というもの。
そのために必要なのは
1)D&Dで落としたファイルのファイル名取得
2)ボタンの動的生成
というもの。

まずはD&D。
これはダイアログのプロパティを開き、
「拡張スタイル」→「ドラッグドロップを許可」
にチェックを入れる。
そして
〜Dlg.hに
   // 生成されたメッセージ マップ関数
   //{{AFX_MSG(CMyDlg)
   virtual BOOL OnInitDialog();
   afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
   afx_msg void OnPaint();
   afx_msg HCURSOR OnQueryDragIcon();
   virtual void OnOK();
   virtual void OnCancel();
   afx_msg void OnDropFiles(HDROP hDropInfo); ←追加
   //}}AFX_MSG
〜Dlg.CPPに
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
   //{{AFX_MSG_MAP(CMyDlg)
   ON_WM_SYSCOMMAND()
   ON_WM_PAINT()
   ON_WM_QUERYDRAGICON()
   ON_WM_DROPFILES() ←追加
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()
さらに↓を追加。
下記の例ではszPathにドロップしたファイル名がフルパスで格納されます。
void CMyDlg::OnDropFiles(HDROP hDropInfo) 
{
   // ドロップされた内容を取得
   int ncnt = 0;
   UINT unSize ;
   char szPath[_MAX_PATH+1];
   
   while(1)
   {
      // ドロップされた内容を取得
      unSize = 
      ::DragQueryFile( hDropInfo, 
         ncnt++,
         szPath, 
         _MAX_PATH);
      if( unSize <= 0)
      {
         break;
      }
   }
   CDialog::OnDropFiles(hDropInfo);
}

で。

次はボタンの動的生成。
      CButton *but; ←先にメンバ変数として定義しておく。
      but = new CButton(); 
      but->Create("キャプション"
         ,BS_PUSHBUTTON|WS_CHILD | WS_VISIBLE
         ,CRect(1,30+m_nButtons*30,140,54+m_nButtons*30)
         ,&m_pMainTabSheet,IDC_BUTTN_1);

CRect(1,30+m_nButtons*30,140,54+m_nButtons*30)
これはサイズと位置を指定している。
(左端,上,右端,底)
の座標を指定するのだ。


&m_pMainTabSheet
は親のハンドル。ここではタブシートを使っている。


これで親ハンドルに指定したコントロールの上にボタンが生成される。
OnDestroyとかでbutをdeleteするのを忘れないように。