C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: アウトライン


(過去ログ 21 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■8795 / inTopicNo.1)  アウトライン
  
□投稿者/ ヤン (1回)-(2007/10/10(Wed) 16:41:17)

分類:[C/C++] 

お世話になります。

GetGlyphOutline関数を使用して、
アウトライン情報を取得し、
取得したパスをつないで文字を描画したいです。

GetGlyphOutlineの使用法は分かったのですが、
取得したアウトライン情報lpBufferを
TTPOLYGONHEADER構造体、
TTPOLYCURVE構造体に分割する方法を教えてください!


    char *str = _T( "あ" );
    UINT u1, u2;
    UINT nChar;
    UINT nFormat;
    LPGLYPHMETRICS lpgm;
    DWORD cbBuffer;
    LPVOID lpBuffer;
    MAT2 lpmat2;
    u1    = *( BYTE* )str;
    u2    = *( BYTE* )( str + 1 );
    nChar = u1 << 8 | u2;

    memset(&lpmat2, 0x00, sizeof(MAT2));
    lpmat2.eM11.value = 1;
    lpmat2.eM22.value = 1;

    // あらかじめ取得しておいたフォントをセット
    SelectObject(&font);


    cbBuffer = pDC->GetGlyphOutline( nChar, GGO_NATIVE, lpgm, 0, NULL, &lpmat2 );
    lpBuffer = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbBuffer);
    cbBuffer = pDC->GetGlyphOutline( nChar, GGO_NATIVE, lpgm, cbBuffer, lpBuffer, &lpmat2 );

引用返信 編集キー/
■8799 / inTopicNo.2)  Re[1]: アウトライン
□投稿者/ mあ (100回)-(2007/10/10(Wed) 18:08:22)
No8795 (ヤン さん) に返信
> GetGlyphOutlineの使用法は分かったのですが、
> 取得したアウトライン情報lpBufferを
> TTPOLYGONHEADER構造体、
> TTPOLYCURVE構造体に分割する方法を教えてください!

http://kone.vis.ne.jp/diary/diaryb08.html

これで解決ですね。


引用返信 編集キー/
■8802 / inTopicNo.3)  Re[2]: アウトライン
□投稿者/ ヤン (2回)-(2007/10/10(Wed) 19:09:07)
No8799 (mあ さん) に返信

> http://kone.vis.ne.jp/diary/diaryb08.html

ここのHP拝見させて頂きましたが、VB→C++に直せないです。。。

引用返信 編集キー/
■8823 / inTopicNo.4)  Re[3]: アウトライン
□投稿者/ mあ (101回)-(2007/10/11(Thu) 00:49:40)
2007/10/11(Thu) 00:55:38 編集(投稿者)
2007/10/11(Thu) 00:51:54 編集(投稿者)

<pre><pre>■No8802 (ヤン さん) に返信
> ■No8799 (mあ さん) に返信
>
>>http://kone.vis.ne.jp/diary/diaryb08.html
>
> ここのHP拝見させて頂きましたが、VB→C++に直せないです。。。
>

ありゃりゃ?こりゃ残念でしたね。

C++に直す方が簡単なんですけどね。

VBにしか無い機能−>C++で作る
VB/C++両方にあるけど記述が微妙−>素直にC++で同じロジック書いてみる
VBの文法がわからん−>適当でいいのであてずっぽうで、ごり押し

こんな感じですかね。もっとお気楽に臨めば解決の糸口が見えてきますよ。
がんばってください。

C++やっている方には言語コンバートなんざしょほの初歩であると思っています。
なんたって唯一何でも出来る言語ですから。

ところで可変長な構造体って理解できていますか?
これが分かれば半分終わったようなものっぽいですよ。

typedef struct AAA {
int a;
char b[1];
} _AAA;

_AAA *p = (_AAA*)malloc(sizeof(AAA) + 256);
p->b[0] から 255 までアクセスできるんですよねw

typedef struct _TTPOLYCURVE { /* ttpc */
WORD wType;
WORD cpfx;
POINTFX apfx[1];
} TTPOLYCURVE;

これの場合は、
TTPOLYCURVE *p = (TTPOLYCURVE*)malloc(sizeof(TTPOLYCURVE) + (sizeof(POINTFX) * 100));
ってことです。

きっと頂点の数があらかじめ分かってないから、GetGlyphOutLine() 内部では、
realloc して、後ろを伸張しているのでしょうね、たぶん。もしかしたら閾値
とか使って一定数分伸張しているのかもしれません。cpfx + 16 くらいまで
配列参照してみるといいこと(未初期化領域云々の例外か何かでるはず)あり
ますよ。


場合によっては便利ですよね〜。



</pre></pre>
引用返信 編集キー/
■8864 / inTopicNo.5)  Re[4]: アウトライン
□投稿者/ ヤン (4回)-(2007/10/11(Thu) 18:28:16)
No8823 (mあ さん) に返信

正直なところ、C++経験は一、二週間で何も分かっていません。
おまけにVBのろくに触ったことないので、、、
勉強になります!!

教えていただいたHPにサンプルがありましたね。
今はそちらを解析中です。

>typedef struct AAA {
>int a;
>char b[1];
>} _AAA;

>_AAA *p = (_AAA*)malloc(sizeof(AAA) + 256);
>p->b[0] から 255 までアクセスできるんですよねw

C++での可変長な構造体の可変長配列?
の作成の仕方が良く分からないです。。。
↑のsizeof(AAA) + 256)の256の部分は、
可変長配列のサイズを指定できるってことなんでしょうか?






引用返信 編集キー/
■8865 / inTopicNo.6)  Re[5]: アウトライン
□投稿者/ 恣意の (17回)-(2007/10/11(Thu) 19:42:23)
2007/10/11(Thu) 20:24:21 編集(投稿者)
2007/10/11(Thu) 20:23:32 編集(投稿者)

> lpBuffer = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbBuffer);
> cbBuffer = pDC->GetGlyphOutline( nChar, GGO_NATIVE, lpgm, cbBuffer, lpBuffer, &lpmat2 );

ここまでで必要な情報を取得されているような気がするので、
それぞれのエラーチェックをちゃんとやっておいた後、

    TTPOLYGONHEADER* pTtPolyHead  = (TTPOLYGONHEADER*)lpBuffer;
    TTPOLYCURVE*     pTtPolyCurve = (TTPOLYCURVE*)(lpBuffer + sizeof(TTPOLYGONHEADER));

で、情報を分割して・・・TTPOLYCURVE構造体の数は以下かしら?

    DWORD dwTtPolyCurve = (pTtPolyHead->cb - sizeof(TTPOLYGONHEADER)) / sizeof(TTPOLYCURVE);

# んー、実際に動かさないと何とも言えないなぁ、これ...
# MSDN見ても実データ見ないとピンとこねぇorz


<追記>
うっは、全然違うっぽい!!!
ごめんなさい、ごめんなさい、上記は忘れてください

# > http://kone.vis.ne.jp/diary/diaryb08.html
# http://support.microsoft.com/kb/87115/ja
# 上二つを見る限り、一個一個データを参照しなきゃっぽいのね

引用返信 編集キー/
■8874 / inTopicNo.7)  Re[5]: アウトライン
□投稿者/ mあ (106回)-(2007/10/12(Fri) 00:58:27)
No8864 (ヤン さん) に返信
> 可変長配列のサイズを指定できるってことなんでしょうか?

このHPの解説の中盤あたりに、
「アウトライン全体」って図があるでしょう?

これは GetGlyphOutLine した結果返ってきたバッファの先頭に順番にキャストしていけば
終わりですねん。
char * のバッファを渡すとその中に結果を格納してくれるのですから、
pszBuffer とか名前として、ブロック数が dwBlockSize だとすると、

while (dwBlockSize > 0) { 
   TTPOLYHEADER *ph = (TTPOLYHEADER*)&pszBuffer[0];
   TTPOLYCURVE  *pc = (TTPOLYCURVE*) &pszBuffer[sizeof(TTPOLYHEADER)];
   //でして、
   for (WORD i=0;i < pc->pcfx;i++) {
      pc->apfx[i];
   }
   //で1ブロックの読み込み完了。

   //ポインタを次のブロック読み込み開始位置に進めて
   pszBuffer += ph->dwSize;
   dwBlockSize--;
}

てな感じになると思われ・・・

引用返信 編集キー/
■8946 / inTopicNo.8)  Re[6]: アウトライン
□投稿者/ ヤン (5回)-(2007/10/15(Mon) 10:11:57)
出来ました!!!!!!!

ありがとうございます><
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -