プロが教える店舗&オフィスのセキュリティ対策術

CやVB6の経験は長いが、C++については、初心者です。

WordにOLE埋め込みするOLEサーバコンポーネントをC++で作ってます。
(Wordがコンテナです)
RECT上にBitbltで、Gif画像を描いていて、それは、ちゃんと表示されているのですが、
いざ、Wordに埋め込むために、更新メニュークリック時のMsgループ内で
if (m_bEmbedding && m_pDataAdviseHolder != NULL){
     m_pDataAdviseHolder->SendOnDataChange(static_cast<IDataObject *>(this), 0, DVASPECT_CONTENT);

m_bDirty = TRUE;
とやってるのですが、RECTの枠しかWord上に表示されません。
どのメソッドを調べればいいのか、お教え下さい。

一応、GetData にブレークポイントを入れているのですが、引っかかりません。
ただ、RECTの枠だけは、Word上に出てはいます。

尚、プログラムの大枠は、EternalWindowsさんの
http://eternalwindows.jp/ole/oleembedded/oleembe …
を使わさせて頂いております。
それから、RECT上にBitbltで、Gif画像を描くのは、以下のようにしています。
void CObject::DrawShape(HDC hdc)
{
inti;
RECTrc;
longPictureWidth;
longPictureHeight;

i = 0;
rc = m_shape[i].rc;
Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
if (m_vbHDC != NULL){
    PictureWidth = rc.right - rc.left;
    PictureHeight = rc.bottom - rc.top;
    BitBlt(hdc, 0,0, PictureWidth, PictureHeight, m_vbHDC, 0,0, SRCCOPY);
}

それと、メタファイルの作成は、、、
x=0; y=0;
GetSize(&nWidth, &nHeight);
SetRect(&rc, x, y, x + nWidth, y + nHeight);
hdc = CreateEnhMetaFile(m_vbHDC, NULL, &rc, "AAA");

SetMapMode(hdc, MM_ANISOTROPIC);
SetWindowOrgEx(hdc, 0, 0, NULL);
SetWindowExtEx(hdc, nWidth, nHeight, NULL);

DrawShape(hdc);

hmf = CloseEnhMetaFile(hdc);

sizel.cx = nWidth;
sizel.cy = nHeight;
DPtoHIMETRIC(&sizel);

hglobal = GlobalAlloc(GPTR, sizeof(METAFILEPICT));
lpmf = (LPMETAFILEPICT)GlobalLock(hglobal);
lpmf->hMF = (HMETAFILE)hmf;
lpmf->mm = MM_ANISOTROPIC;
lpmf->xExt = sizel.cx;
lpmf->yExt = sizel.cy;
GlobalUnlock(hglobal);
//if (bEnhance) {
DWORD dwSize;
LPBYTE lpData;
HGLOBAL hglobalOld = hglobal;

dwSize = GetMetaFileBitsEx(lpmf->hMF, 0, NULL);
lpData = (LPBYTE)GlobalAlloc(GPTR, dwSize);
GetMetaFileBitsEx(lpmf->hMF, dwSize, lpData);
hglobal = (HGLOBAL)SetWinMetaFileBits(dwSize, lpData, NULL, lpmf);

GlobalFree(lpData);
GlobalFree(hglobalOld);
//}
return hglobal;
です。
忌憚のないご指摘をお願いします。

A 回答 (1件)

>一応、GetData にブレークポイントを入れているのですが、引っかかりません。



についてだけ、ちょっとコメントを・・・。

Word 上でオブジェクトの挿入(新規作成)を行うと、OLE サーバが起動すると思うのですが、
この、Word から呼ばれて起動したプロセスは、デバッガ ( Visual Studio ? ) で起動しているプロセスとは別のプロセスとして起動しているので、ブレークポイントに引っかからないのだと思います。
Visual Studio なら、メニューの「ツール(T)」→「プロセスにアタッチ(P)」というのがあると思いますので、これで、Word から起動されたプロセスを選択すれば、デバッガでトレースできるようになるのではないかと思います。(他のデバッガについてはわかりません。あしからず。)

もしかすると、リリースビルドではなくデバッグビルドの *.exe が起動するようにレジストリの登録をしておかなければならないかも、です。
    • good
    • 0
この回答へのお礼

ありがとうございました。
おかげで、ほとんど、できあがりました。感謝です。
原因は、見ての通り、EnhMetaFile APIと普通のMetaFile APIの混在、
GetDataの描画に、BitBltでなくPlayEnhMetaFile() を使ったため
BitBlt時、転送元DCが無効になるケースがあったため
でした。

お礼日時:2011/01/07 00:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!