ダイアログフォントとActiveXについて

解決


なる  2006-06-27 09:13:35  No: 62338

OS:Windows2000
VS.NET2003
にて開発を行っております。

SDIベースFormViewのフォントとダイアログのフォントを起動時に
変更する、にチャレンジしているのですが、ダイアログはDoModal()を
オーバーライドする以下のソースで実現できました。

INT_PTR CxxxDlg::DoModal()
{
        CDialogTemplate dlt;
        INT_PTR             nResult;

        if (!dlt.Load(MAKEINTRESOURCE(CxxxDlg::IDD))) return -1;

        dlt.SetFont("MS UI Gothic", 14);

        LPSTR pdata = (LPSTR)GlobalLock(dlt.m_hTemplate);

        m_lpszTemplateName = NULL;
        InitModalIndirect(pdata);

        nResult = CDialog::DoModal();

        GlobalUnlock(dlt.m_hTemplate);
          return nResult;
}
ただし、ActiveXは上の方法だと表示自体されません。
リソースエディタでダイアログのフォントを変更するとActiveXも他のコントロール
と同様に伸縮します。

FormViewのフォントを起動時に変更する方法とActiveXを表示するには
どのような処理を行えば実現できるのでしょうか。

よろしくお願いします。


dairygoods  2006-06-27 19:46:35  No: 62339

バグっぽいですね。
以下のようにしてみてください。

LPCTSTR pszId = MAKEINTRESOURCE(CxxxDlg::IDD);
HINSTANCE hInst = AfxFindResourceHandle(pszId, RT_DLGINIT);
HRSRC hResource = FindResource(hInst, pszId, RT_DLGINIT);
HGLOBAL hDlgInit = LoadResource(hInst, hResource);
void* pDlgInit = LockResource(hDialogTemplate);

CDialogTemplate dt;
dt.Load(pszId);
//dtをいじる
LPCDLGTEMPLATE pTemplate = 
  (LPCDLGTEMPLATE)LockResource(dt.m_hTemplate);

m_lpszTemplateName = NULL;
InitModalIndirect(pTemplate, m_pParentWnd, pDlgInit);

//表示
//後始末


なる  2006-06-28 07:10:11  No: 62340

なるです。
dairygoodsさん、ありがとうございます。

ActiveXも表示することができました。

>void* pDlgInit = LockResource(hDialogTemplate);
はvoid* pDlgInit = LockResource(hDlgInit);
ですよね。

あと、FormViewの変更方法がわからないのですが、ご教授いただけないでしょうか。

よろしくお願いします。


dairygoods  2006-06-28 19:03:14  No: 62341

>>void* pDlgInit = LockResource(hDialogTemplate);
>はvoid* pDlgInit = LockResource(hDlgInit);
>ですよね。

そうですね。すみません、記述ミスです。

> あと、FormViewの変更方法がわからないのですが、ご教授いただけないでしょうか。

FormView の場合、VIEWFORM.CPP の CFormView::Create() 関数内で、
CreateDlg を呼び出して、ダイアログを作っています。

この部分を自分で用意したテンプレートと置き換える仕組みは
用意されていないように見えます。

CFormView::Create() をオーバーライドして、
関数の中身を丸ごとコピーし、
CreateDlg 呼出しの部分だけを書き換える
といった方法しかなさそうです。


なる  2006-08-17 07:02:23  No: 62342

dairygoodsさん、返事が大変遅くなって申し訳ありませんでした。

Create関数とCreateDlg関数をオーバーライドし、CreateDlg関数内
CreateDlgIndirectに自分で用意したテンプレートを引数に与えることで
実現できました。

CreateDlg関数はafximpl.hをインポートし、dlgcore.cppのものをコピーして使用しました。
dairygoodsさんのヒントからやっとゴールできました。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加