Win32API質問箱 Build127

■ このスレッドは過去ログ倉庫に格納されています
2021/12/09(木) 21:32:56.60ID:sYLpmj89
Win32APIについての質問はこちらへどうぞ。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

■過去スレ
Win32API質問箱 Build126
https://mevius.5ch.net/test/read.cgi/tech/1588339011/
Win32API質問箱 Build125
https://mevius.5ch.net/test/read.cgi/tech/1551247748/
Win32API質問箱 Build124
https://mevius.5ch.net/test/read.cgi/tech/1510395780/

■関連スレ
Visual Studio 2020 Part1 https://mevius.5ch.net/test/read.cgi/tech/1634166667/
Visual Studio 2019 Part7 https://mevius.5ch.net/test/read.cgi/tech/1634178709/
Visual Studio 2017 Part7 https://mevius.5ch.net/test/read.cgi/tech/1558179898/
【C++】 DirectX初心者質問スレ Part41 【C】 https://mevius.5ch.net/test/read.cgi/tech/1521786252/
2022/08/01(月) 16:46:02.44ID:lS5VDU2q
MFCを勧める人はいないんかい・・・
2022/08/01(月) 17:30:54.15ID:EZlLH+eW
統合環境の力技でマクロ埋め込んだりするしねぇ 癖や方言が強い
2022/08/01(月) 19:48:54.56ID:kaXTkJ9F
いまさら MFC を使いたいんですけど、まずどうすればいいですか?
2022/08/01(月) 20:38:09.58ID:Z+HQWfkn
>>284

windowsx.hで定義されてるHANDLE_MSG()マクロを使えば
いちいちcase文を書く必要がない

switch (uMsg)
{
HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
...
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

使わないメッセージはスルーしていい
OnCreate()やOnCommand()のプロトタイプもwindowsx.hで定義されてるので引数を間違ったらエラーで教えてくれる
2022/08/02(火) 17:15:54.00ID:64Iv6nA4
#define BEGIN {
#define END }
に近い感じなので マクロにお任せってあまり好きではない(個人的感想)
2022/08/02(火) 21:12:37.20ID:NatehBYU
false、False、FALSE色々あるなあ
2022/08/02(火) 22:59:22.62ID:clR4IgPX
こういうシステム的な部分を作るとき厄介なのが細かい引数間違えたりすることなのですべて定義されてるのは助かるよ
windowsx.hに入ってるってことはMS推奨なんだろうし
2022/08/03(水) 08:49:02.53ID:HRex91Fl
そのヘッダか忘れたけどコモンコントロール系はマクロが無いとやってられん
それ前提でMSDNにリファレンスがあるし
2022/08/03(水) 12:38:08.58ID:t9tQNkon
そこでWTLですよ
2022/08/03(水) 23:45:13.40ID:+fTvsC8V
感動した
https://github.com/CobaltFusion/DebugViewPP
2022/08/04(木) 23:07:37.30ID:iuI8tOa1
そういえばバイナリエディター「Binary Editor BZ」はWTL使ってたはず
296デフォルトの名無しさん
垢版 |
2022/08/05(金) 02:46:33.66ID:RasK5Hhu
大きな文字や小さな文字をコマンドプロンプトに同じ行で表示したいのですが可能でしょうか?
設定で変えるのではなくプログラムで結果によって変えたいのですが
よろしくお願いします。
2022/08/05(金) 03:00:58.31ID:CLX9KL3y
「あ」と「ぁ」みたいに?
2022/08/05(金) 13:41:02.21ID:w8qsceV0
8pt
   ■                 
   ■  ■     ■ ■■■■■  
 ■■■■       ■    ■   
   ■ ■     ■  ■■■■■■ 
  ■■■■■■   ■     ■   
 ■■■■   ■  ■     ■   
■  ■■   ■  ■■ ■■■■   
■ ■■   ■■  ■■ ■  ■■■ 
■■■■  ■■    ■ ■■■■   

16pt
      ■                ■               
      ■     ■         ■■   ■      ■■■  
     ■■■■■■■■         ■■   ■■■■■■■     
 ■■■■■■■■■            ■■        ■■     
     ■■               ■■        ■■     
     ■■   ■■          ■■        ■■■■■  
     ■■■■■■■■■        ■    ■■■■■■■■■■  
     ■■■ ■■ ■■■       ■         ■■     
   ■■■■  ■■   ■■     ■■         ■■     
  ■■ ■■ ■■     ■■    ■■         ■■     
 ■■  ■■ ■■     ■■    ■■ ■       ■■     
 ■■  ■■■■      ■■     ■■■   ■■■■■■     
■■   ■■■       ■■     ■■■  ■■   ■■■■   
■■   ■■       ■■      ■■   ■    ■■ ■■■ 
■■  ■■■     ■■■       ■■   ■■   ■■  ■■ 
 ■■■  ■   ■■■■        ■■    ■■■■■      
          ■■                           
2022/08/05(金) 18:10:13.24ID:uan7vRb+
色なら変えられるが
https://nodachisoft.com/common/jp/article/jp000152/
2022/08/05(金) 22:00:13.48ID:x2QrbwhX
>>296
不可能ッス!!
301デフォルトの名無しさん
垢版 |
2022/08/05(金) 23:51:13.34ID:2v49rt6J
NFT市場が2年で300億円→2兆円に急拡大したワケ
「保有する」だけではない、アート作品につけられた「価値」

市場規模ですね。これは少し古いデータになりますが、直近では、だいたい
2兆円ぐらいの市場規模になります。去年の3月ぐらいから盛り上がってきて、
2019年は300億円ぐらいと言われていたものが急拡大して、今や2兆円と
なっています。
一番大きいのが「コレクティブル」というものです。実際のNFTでいうと、
「CryptoPunks(クリフトパンクス)」とか「Meebits(ミービッツ)」など、
デジタルアートで、これが76パーセントを占めています。
他にはゲーム、スポーツの会員権のようなもの、メタバース上での利用、
アートなどに使われています。
2022/08/06(土) 00:56:36.07ID:c+phwPql
>>301
どうせビットコと同じ運命…
303デフォルトの名無しさん
垢版 |
2022/08/06(土) 01:06:28.07ID:A+9lJBuH
>>297
いえ、フォントのサイズです。
>>299
色も変えたいので見てみます。ありがとうございます。
>>300
そうですか。ありがとうございました。
304デフォルトの名無しさん
垢版 |
2022/08/06(土) 09:37:57.13ID:Cm9is4wi
>>291
>windowsx.hに入ってるってことはMS推奨なんだろうし

20年くらい前なら同意するが
今はもう非推奨
305デフォルトの名無しさん
垢版 |
2022/08/06(土) 09:38:29.30ID:Cm9is4wi
>>285
ダメ、絶対。
306デフォルトの名無しさん
垢版 |
2022/08/06(土) 09:39:01.65ID:Cm9is4wi
>>287
やめとけ
2022/08/06(土) 10:58:35.84ID:gIOgTSvM
じゃあどれならいいんだよw
308デフォルトの名無しさん
垢版 |
2022/08/06(土) 15:56:25.30ID:eSBCWCwI
Win32API
2022/08/06(土) 16:07:28.86ID:LLV93bqs
知識としては必要だが、最初から最後までフレームワーク使わずにWin32だけでやるのは時間の無駄だろう。
2022/08/06(土) 19:02:31.04ID:E+U3mr6/
そうでもない
2022/08/06(土) 19:03:10.71ID:f4eIJ5Mn
>>309
フレームワークの学習コストはどのように評価しますか?
2022/08/06(土) 19:07:52.04ID:LLV93bqs
この先そのコストを回収できるくらいプログラミングする見込みがあるかどうか次第だな。
2022/08/06(土) 20:41:33.14ID:mK2UhqOX
そのWin32APIのラッパーとなるべきフレームワークがことごとくゴミなんだもんよ
MS金余ってんだからQtでも買っときゃよかったのに
2022/08/06(土) 20:42:57.75ID:A61GDKit
>>312
学習した結果フレームワークがうんこだったと自覚したときの絶望感を、学習前にどのように織り込めばいいですか?
2022/08/06(土) 20:58:55.11ID:LLV93bqs
素のwin32と既存のフレームワークと自前のオレオレフレームワークのどれが一番うんこか次第だな。
2022/08/06(土) 21:37:39.73ID:A61GDKit
>>315
あなた自身はどう思っていますか?
2022/08/06(土) 21:39:07.40ID:nAr30yJy
win95時代にCで作ったハンドルメモリリーク検知付きのフレームワーク()があるけどいまだに世話になってる
新規でならC#で適当に作るがアプリの寿命を考えるといまだに上記フレームワーク()になるだろう
2022/08/06(土) 21:54:12.10ID:S1WP3eVH
男なら誰しも自分だけの車輪再発明・・・じゃなかったフレームワークを心に持つよな
2022/08/06(土) 22:13:31.50ID:mZ1/a9El
wxWidgets、DelphiのVLC、それの模倣のLazarus Component Library (LCL)位が今でも活発に開発されてるWin32フレームワークか。
wxWidgetsとC++Builder(VCL)には散々世話になった。
2022/08/06(土) 22:14:29.50ID:mZ1/a9El
×DelphiのVLC
○DelphiのVCL
2022/08/07(日) 21:24:24.65ID:WV/2UEsV
>>317
メモリーリークは
https://mevius.5ch.net/test/read.cgi/tech/1652160275/365
に一晩でちょいちょい、て書いたやつを貼ったら沈黙されてしまった…
普通誰でもそうすると思うのに、rust! rust! と連呼されてもねえ

でもハンドルリークは考えたことなかったなあ…
2022/08/07(日) 22:03:11.08ID:fAQAAmLc
>>321
> 沈黙されてしまった…
相手されてないだけかと...
2022/08/07(日) 22:19:05.28ID:PKSgBlrY
>>322
なる
2022/08/07(日) 22:21:12.86ID:c43tg8Rc
ならんだろ。
2022/08/09(火) 01:28:22.61ID:6wLu/xJX
オレオレライブラリ作って悦に入るのは初心者レベル2のやること
2022/08/09(火) 16:24:46.11ID:rOh0RBr3
経験しておくとライブラリの手抜きがわかってシステムのバグを予想しやすくなるけどな
2022/08/14(日) 17:46:08.17ID:qUOj9dBB
>>318
「車輪の再発明だから駄目」という理念は、先に進んでいるアメリカに有利な言葉。
後発者が上に上がって来ささないため、メンタルからくじく。
アメリカはそういう国。
2022/08/14(日) 18:48:02.83ID:W71axh2R
Googleは車輪の再発明しかしてないけどな
検索だって最初じゃない
その代わり頭の良い奴らが本気でやるから良いものになる
日本が得意としてた事だったがな
2022/08/15(月) 10:36:30.31ID:LrEHeo01
頭の悪い人が足引っ張る法律作って海外に先を越されるパティーン
2022/08/15(月) 10:47:36.26ID:VNnB4sci
>>287
普通に使えばいい。
俺も使ってる。
2022/08/15(月) 14:36:52.56ID:+9oi41Wm
>>327
GNUも再発明なんか?w
2022/08/15(月) 15:43:33.22ID:AOxAYYNB
>>331
彼らは、自分達が造ったものを遣わせてやりたいから「これ以上の再発明はするな」
と言ってくるが、自分達も実は再発明した結果であることは棚に上げている。
2022/08/15(月) 16:18:07.18ID:Z5BB7x+B
ここで車輪の再発明の指摘は的外れ
発明なんて一切してない
他人の成果物をソース読んでないからといって横取りする傲慢野郎
2022/08/15(月) 17:10:35.77ID:YGdpIuz3
いまさらソフトウェア開発競争を国家間の諍いの次元でしか捉えてないやつは
一行もプログラム組んでないのがアリアリだねw
2022/08/15(月) 18:25:51.34ID:AOxAYYNB
国家間というより、先に作ってしまった人が他人に別のものを作ってもらいたくない
心理が働くと、「車輪の再発明禁止」という如何にもまっとうなことらしき標語
となる。
2022/08/15(月) 19:37:50.16ID:/49gMCwa
車輪の再発明禁止は高機能なソフトウェアをオープンソースにするということで囲い込み、再発明させる気を起こさせなくしてる
オープンソース文化が強いものを更に強くしてしまってる
2022/08/15(月) 23:02:24.27ID:dK5hO1Lx
作って楽しそうなものなもものの内、芸術性を伴わず技術だけで
作れるようなものはほぼ全てオープンソースで無料になってしまっている
(フォトショップみたいな高機能なものは除く)。
2022/08/15(月) 23:10:53.60ID:AwPJsiC0
再発明をしないまでもその部品と構成や仕組みを知っていると高機能なアプリ開発などへの機転や応用が利きやすいと思う
339デフォルトの名無しさん
垢版 |
2022/08/16(火) 01:19:06.38ID:agNT7bMr
以下のコードが動かなくて困ってます。

pgfFrame = AVIStreamGetFrameOpen(paviStream, (LPBITMAPINFOHEADER)AVIGETFRAMEF_BESTDISPLAYFMT);
AVIStreamGetFrameClose(pgfFrame); ←これを実行したら落ちる

AVIStreamGetFrameCloseを実行しなくても動くのですが、再度Openした時に少しずつメモリを食いつぶして行くので困ってます。
止まった時にVC++の実行ボタンを再度押すと、内部で使ってるDLLがアンロードされてその後は動くようになります。
そうなると何回でもOpen→Close出来る様になり、メモリも食いつぶしません。
どうしたらいいんでしょうか?
340デフォルトの名無しさん
垢版 |
2022/08/16(火) 11:35:45.33ID:2x3mrzZQ
>>329
ほんそれ
341デフォルトの名無しさん
垢版 |
2022/08/16(火) 11:41:24.43ID:2x3mrzZQ
>>339
AVIStreamRelease
(こっちは自動 Close してくれるとのこと)
342デフォルトの名無しさん
垢版 |
2022/08/16(火) 14:36:20.03ID:agNT7bMr
>>341
詳しく書くとこうなってるんです。
AVIStreamGetFrameCloseだけ落ちるんで困ってます。
これを実行しなくても動くのですが、複数回Openするとどんどんメモリを食いつぶすので困ってます…

AVIFileOpen(&paviFile, FileName, OF_READ | OF_SHARE_DENY_NONE, NULL);
AVIFileGetStream(paviFile, &paviStream, streamtypeVIDEO, 0);
pgfFrame = AVIStreamGetFrameOpen(paviStream, (LPBITMAPINFOHEADER)AVIGETFRAMEF_BESTDISPLAYFMT);

if(pgfFrame != NULL){ AVIStreamGetFrameClose(pgfFrame); } ←これだけ落ちる
if(paviStream != NULL){ AVIStreamRelease(paviStream); }
if(paviFile != NULL){ AVIFileRelease(paviFile); }
2022/08/16(火) 14:45:35.08ID:ySPaUmMI
そういう不具合が出るけど是正が困難な処理は別プロセスとして動かして終わったらそのプロセスを終わらすといいよ
解決したら統合すればいい
344デフォルトの名無しさん
垢版 |
2022/08/16(火) 15:02:38.50ID:2x3mrzZQ
プロセス別けて落とすのも同じ効果だと思うけど
DLLを自前でアンロードするコードを入れても良いんじゃないかな

そもそも
pgfFrame = AVIStreamGetFrameOpen(paviStream, (LPBITMAPINFOHEADER)AVIGETFRAMEF_BESTDISPLAYFMT);

この間の処理に問題があるんじゃないかな

if(pgfFrame != NULL){ AVIStreamGetFrameClose(pgfFrame); } ←これだけ落ちる
2022/08/16(火) 15:28:13.38ID:agNT7bMr
>>343-344
ありがとうございます。

>この間の処理に問題があるんじゃないかな
この間は何にもしてなくても落ちちゃうんですよね… なんでだろう?

DLLを自前でアンロードする事も視野に入れてもう少し試行錯誤してみます
346デフォルトの名無しさん
垢版 |
2022/08/16(火) 15:45:44.34ID:2x3mrzZQ
AVIFileExit();
してないというオチ?
2022/08/16(火) 15:59:37.24ID:agNT7bMr
>>346
AVIFileInit()とAVIFileExit()
前に両方入れてみたんですが、入れても入れなくても何も変わらなかったんですよね…
あとでまた試してみます。
348デフォルトの名無しさん
垢版 |
2022/08/16(火) 16:18:58.86ID:2x3mrzZQ
本気で解決したいなら再現する全ソースコードを晒すのと
実際に読もうとしてるファイルのURLを晒して逝け
2022/08/16(火) 17:58:27.74ID:agNT7bMr
>>348
あとでその部分だけまとめて再現できるか確かめてみます
2022/08/16(火) 20:04:29.51ID:xodQRDI1
必要最小限で描いて観たが全然問題無いぞ
2022/08/16(火) 21:22:52.88ID:agNT7bMr
>>350
原因がわかりました。
普通にやると問題なくて、ここにあるコーデックの.dllをリンクすると
AVIStreamGetFrameCloseが上手くいかないようでした。
https://sourceforge.net/projects/x264vfw/files/
このコーデックを使う必要があるのでどうにかならないでしょうかね。
352351
垢版 |
2022/08/16(火) 21:27:27.79ID:agNT7bMr
正確にはコーデックの.dllをリンクして
そのコーデックを使っているファイルを読み込むと
AVIStreamGetFrameCloseが失敗するということです。
.dllをリンクしててもそのコーデックを使ってないファイルであれば
AVIStreamGetFrameCloseが失敗する事はなかったです。
353351
垢版 |
2022/08/16(火) 23:11:48.85ID:agNT7bMr
古いバージョンにしてみたら直りました!
これで普通に動いてるのでこのまま動かしてみます。
みなさんありがとうございました。
354デフォルトの名無しさん
垢版 |
2022/08/17(水) 09:12:41.44ID:17qdbn+g
バカの三大特徴

情報を小出しにする&後出しする
自分は間違ってないと思い込む&言い張る
正しい解決策に進まずすぐに別の山に登ろうとする
2022/08/17(水) 10:05:31.13ID:75soL8XV
FFmpeg 使った方が良くね?
2022/08/17(水) 11:59:16.72ID:75soL8XV
ああ
それを言うなら ffdshow の方だったかな
しかしまだ使えるんかなこれ
2022/08/18(木) 16:29:05.82ID:9oKj6z2J
xvideos
2022/08/22(月) 16:22:19.61ID:ChTfYzF8
日本語キーボード日本語Windowsで英数キー(CapsLockキー)のアップを捕捉する事って不可能?
レジストリでキーマップを変えて英数キーを違うキーに割り当てた後なら一般的なキー同様に捕捉出来ることは確認できたけどそういう迂回方法無しで出来る方法があれば教えてもらいたい
2022/08/22(月) 17:26:47.15ID:Zp58Sca6
GetKeyState( vk_code )
 VK_CAPITAL CapsLockのトグル状態 のほうじゃなく
 VK_OEM_ATTN 仮想キーコード 240 (0xF0) で今の押下状態は取得できそうではあるな

IMEはちゃんと shift 無し Caps lock キーを受け取って反応できてるんだし
2022/08/22(月) 18:22:10.86ID:9oiM0iks
ないです
2022/08/22(月) 18:27:49.15ID:x6NjRtAl
ノートパソコンなどの省スペースキーボードについてるFnキーも拾えないんだよなあ、GetKeyState&GetAsyncKeyState
2022/08/22(月) 21:05:07.73ID:pMMCnUP8
fnはosの預かり知らないキーなので同列にすんなハゲハゲハゲハゲハゲ!!!!!!!!!!!
2022/08/22(月) 21:25:09.66ID:6BQsurqE
キーボードのコントローラーが勝手に処理してるでしょう
CPUまで線がつながってない感じ
2022/08/23(火) 07:39:49.30ID:W/9/eWQQ
>>359
SetTimerとかで定期監視するしか無さそうか
2022/08/25(木) 23:57:16.63ID:ePt16zWH
今はarduinoとかで自分好みのキーボード作れる時代なんだぜ
知らんけど
2022/08/26(金) 10:40:49.53ID:lf60l9vY
虫歯が痛いなら総入れ歯にしましょう!レベルの解決策w
2022/08/26(金) 12:29:39.93ID:NrrxL3kr
禿げてきたら丸坊主にしましょう!
2022/08/26(金) 12:48:26.23ID:im0ZYKIt
なんて日だ!
2022/08/31(水) 12:36:32.64ID:twZsJrmt
>>355
ライセンスはどうしてるの?
GPLやLGPLだから、リンクすれば最低でも自作プログラムのオブジェクト
ファイルの公開が必要になるだろう。
別コマンドで実行する場合は、*.exe が自作アプリと合わせて二つ必要になるし、
データの受け渡しの効率も落ちる。
2022/09/02(金) 22:59:42.92ID:L2uZLmEf
質問です。

GetCharABCWidths()を用いて、TextOut()で描いた文字のABC構造体を取得しています。

Arialフォントのような欧文フォントを用いてTextOut()で"あ"を描いた場合、そのフォント内には"あ"という日本語文字は入っていないため、適当な代替フォントに置き換えられて"あ"が描かれるようです(たぶん「フォントリンク」という機能だと思います)。

この時にGetCharABCWidths()で得られるABC構造体には、描かれた"あ"の寸法が入っておらず、ダミーの寸法が入ってきてしまいます。

msdnのGetCharABCWidths()APIの項には、
The ABC widths of the default character are used for characters outside the range of the currently selected font.
とあるので、APIとしては仕様どおりの動作なのですが、では、描かれた"あ"のABC寸法を得るにはどうすればよいのでしょうか?

以上、よろしくお願いします。
371デフォルトの名無しさん
垢版 |
2022/09/04(日) 10:57:34.63ID:RQxkFcRF
GetTextExtentPoint32()
SetTextJustification()
DrawText()
2022/09/04(日) 16:57:14.39ID:aZX/9mcR
>>371
ありがとうございます。

GetTextExtentPoint32()だと、文字の左余白(A), 文字自体の幅(B), 文字の右余白(C)の
和の値(A+B+C)しか得ることができません。

そうではなくて、各文字について、A,B,Cそれぞれの値が知りたいのです。
それを返してくれるのがGetCharABCWidths()なのですが、>>370に書いたように
正しい値が返ってこない場合があります。

一応、自分で考えた対処方法として、
1. GetTextExtentPoint32()で、文字のA+B+Cの値を取得
2. その幅を持つ白色の描画領域を確保し、その原点位置から黒色でその文字を描画
3. 領域に描画された結果(白・黒)を左端から走査して、左余白(A)を得る
4. 同様に右端から走査して、右余白(C)を得る
5. 手順1で取得したA+B+Cの値からAとCを減じてBを得る
という風にすれば、(どんくさいですが)知りたい値を得ることはできると思います。

ちなみに、実際には、上のやり方そのままではうまくいかないことがありそうです。
というのも、イタリック体にしたりすると、AやCの値がマイナスになることがあるからです。
その場合、上のやり方だと、文字の左右が領域からはみ出て描画されてしまいます。

なので、左右にある程度の余裕を持った領域、例えば幅「100+A+B+C+100」の領域を確保し、
(x,y)=(100,0)の位置に文字を描画する。
そうするとはみ出さずに描画できるので、100の余分な余白があることを考慮に入れて計算すれば、
A,B,Cを得られるだろうと考えています。

でも、こんなやり方は面倒くさい。もっとマシなやり方はないのだろうか・・・。

例えば、フォントリンク?で描画されたときに、どのフォントが使われたのかがわかれば、
そのフォントを明示的にデバイスコンテキストに指定してGetCharABCWidths()呼べば
A,B,Cの幅を得られるはずですが、フォントを知る方法はわかりませんでした。
2022/09/04(日) 17:09:08.67ID:A8KVTWK8
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-gettextmetrics
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-textmetrica

>日本語文字は入っていない
結局この問題は残るんじゃないかな
確実に日本語グリフが入ってるフォントを指定
2022/09/04(日) 19:32:04.85ID:aZX/9mcR
ありがとうございます。

作っているアプリの仕様は、
・アプリのユーザは、フォントと文字列を自由に指定できる
・画面上には、指定したフォントで、指定した文字列が描画される

やりたいことは、
・ユーザが上記の操作で描画させた文字列中の各文字について、A,B,Cの幅を知りたい

ということなのです。

本来NGな組み合わせ(例:欧文フォントと、全角まじり文字列との組み合わせ)をユーザーが指定した時、
存在しない文字がいわゆる豆腐(□)にでも化けてくれれば、そこでユーザは別のフォントを
選びなおすはずです。

しかし、文字化けせずに一見正しく表示されてしまうため、困っています。
2022/09/04(日) 23:44:22.53ID:047Xbk5t
>>374
ABCなんて何に使うんだろうと思ったら、フォント情報を表示するツールなのか。
GetCharacterPlacement + ExtTextOut / ETO_GLYPH_INDEX あたりで、グリフを直接描画すれば
フォントリンクは効かないはずなので無い文字は豆腐になるはず...
2022/09/05(月) 20:04:11.68ID:lEq1EKXB
ありがとうございます。
参考にさせていただきます。

可能ならば、無理やり豆腐にするんじゃなくて、フォントリンクで表示されたとおりの文字の情報を取得できるのが理想ですが、難しそうですね・・・
377375
垢版 |
2022/09/05(月) 23:27:10.40ID:ViUtFxr1
>>376
GetCharABCWidthsで取得しても1文字単位でしか取得できないので、筆記体やアラビア文字のように前後の文字や位置によって大きさが変わるような場合には対応できないので、ABCの値は参考程度にしか使えないと思います。

フォントリンク先のフォント情報(LOGFONT)は、メタファイルに出力後そのメタファイルを解析するというちょっとトリッキーな方法で可能です。
https://stackoverflow.com/questions/54050095/how-to-tell-if-a-surrogate-pair-unicode-character-is-supported-by-the-font
2022/09/06(火) 20:18:06.15ID:H7QyPUx+
大変有用な情報、ありがとうございます。

確かに、筆記体のような手を繋ぐフォントの場合、うまくいきませんね。
これは気づきませんでした。
実際にはそういったフォントが使われることはまれなので、大きな問題にはならないかな、と思います。
379デフォルトの名無しさん
垢版 |
2022/09/10(土) 21:08:59.03ID:eGqDTe4p
HBITMAP hBitmap; に既に bitmap image が load されているとき
BITMAP bm = {0};
GetObject(hBitmap, sizeof(BITMAP), &bm);
で bm.bmBits の指す場所に pixles data があることは確認出来るのですが
bm.bmBits は何時 GlobalFree(bm.bmBits); すれば良いのでしょうか?
放置しても memory leak の心配はありませんか?
2022/09/11(日) 13:04:53.74ID:4ex9Us8K
DeleteObject(hBitmap);
381デフォルトの名無しさん
垢版 |
2022/09/13(火) 22:06:19.57ID:V8hEwwJT
ウインドウのキャプションを SetWindowText で変更したいのですが

そのウインドウはブラウザ(クローム系)でして
SPY++が使えなくなっているので自作のウインドウ一覧で調べると
ブラウザのトップレベル・ウインドウは、アクティブなタブのキャプションが
ウインドウのキャプションになっており、クラス名は"Chrome_WidgetWin_1"でした

これで取得したウインドウ・ハンドルを使って、ブラウザの位置を操作したり
最小化したりできるので、このハンドルで間違いないはずですが

SetWindowText でキャプションを変更することはできません
ブラウザには使えないということでしょうか
御存じの方、教えて下さると幸いです
2022/09/14(水) 01:18:29.10ID:LQT6KG16
ウインドウというよりタブなんじゃね?
383デフォルトの名無しさん
垢版 |
2022/09/14(水) 09:06:44.89ID:bpmiLen5
そうです
ウインドウのキャプションを変更したいけど
それはブラウザでは、タブのキャプションを変更したいということですね

ブラウザのトップレベルのウインドウハンドルで、GetWindowTextを使って
そのタブのキャプションが取得できるのに
逆に、そのハンドルでタブのキャプションはSetWindowTextでは変更できない
ということのようです

タブが子ウインドウになっていてアクセスできればいいのですが
そこらへんブラウザは色々と特殊な作りなので無理っぽい気はしてます
2022/09/14(水) 09:46:31.10ID:mWSu9Hj1
ふーんGetはできるんだタスクバー用かな?
どう見てもオーナードローだし
htmlのtitle変える方が早そうだね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況