トップページ⇒tech
1001コメント347KB

Win32API 質問箱 Build6

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

過去スレ
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/
Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0002デフォルトの名無しさんNGNG
2ゲットし放題!
0003デフォルトの名無しさんNGNG
前スレの>>968
是非お願いします。

http://210.153.114.238/cgi-bin/upbbs2/imgboard.cgi
ここにUPして頂けますか?
0004デフォルトの名無しさんNGNG
>>3
猫でも〜にもあったが、あれじゃいかんの?
0005デフォルトの名無しさんNGNG
>>前スレ973

それが出来ないから困ってるんですよ
たとえばMSゴシック11ptだと全角の幅=半角*2にならないので、
GetTextExtentPoint32等を含む通常のAPIでは描画結果がずれるのです。

なので、手動で補正もしくはExtTextOutで強制的に幅を指定しないといけないのですが、
自前で調整するには文字が半角か全角かを判別しなければなりません。
で、SJISだけなら問題なかったのですが、UNICODE(UCS2)だと、
すべての文字が2byteで表されるわけで、困っちゃったな、ということです。

プロポーショナルだと楽なんですが、そういうわけにも行かないので。
0006前スレ959NGNG
取得したいのは論理単位でです。
おなじ12ptでもフォントによってTEXTMETRICのtm.tmHeightは異なるので
上限があるのかなと思ったのですが…

高さの上限は決められていないのでしょうか。
わかる方お願いします。
0007デフォルトの名無しさんNGNG
>>3
http://210.153.114.238/img-box/img20020921043840.zip
うぷした。
パスワードはsplitterね。

ウインドウクラスにControlを継承させてからSetControlする。
それから、HandleMessageに適切なメッセージを渡せば使えるはず。
0008デフォルトの名無しさんNGNG
>>5
Unicode文字をANSIに変換してバイト数を得るのはまずいのか?
でもあんただったらそのくらい分かりそうから、ボツなんだろうな。
0009デフォルトの名無しさんNGNG
>>4
あの方法で、3つや4つに分割できますか?
0010デフォルトの名無しさんNGNG
>>7
どうもありがとうございます
早速DLさせてもらいます
0011デフォルトの名無しさんNGNG
>>6
フォント作成時にサイズを-xとかにしたら?
0012デフォルトの名無しさんNGNG
>>8
UNICODE化の目的は似非I18nなので、
UNICODE->ANSI(SJIS)にマッピング出来ない文字もあるわけでして…
0013デフォルトの名無しさんNGNG
スクロールバーをつまんでで移動したとき
漏れのアプリだとボタンを話すまで再描画されないのだが
他のアプリは バーが動くとすぐ描画されてる気がする

なんか指定しないといかんの?
0014デフォルトの名無しさんNGNG
SetScrollInfoでSIF_TRACKPOSを指定してないとか
0015 NGNG
>>5
固定ピッチなら、明らかに半角であると分かっている文字の幅より
広ければ全角とみなして構わないのではないか?
0016デフォルトの名無しさんNGNG
ListViewで、特定の行だけ色を変えたいんですが
どうすればいいでしょうか。
ListView_SetTextColorとかだと全体が色変わっちゃうし。
0017デフォルトの名無しさんNGNG
>>15
なんかしょぼ〜んだけど、以外とそれが正解クサイかも
全角半角の整合が取れなくても、それぞれ半角同士全角同士は整合取れてるはずだから。
サンクス!
0018デフォルトの名無しさんNGNG
>>5
Unicodeの半角全角の表。これ使ってみる?
http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
説明はこれ。
http://www.unicode.org/unicode/reports/tr11/
0019デフォルトの名無しさんNGNG
>>前976 >>18
どうもです。
しかし、これを見ると文字幅は一意に決定することが出来ないようですね。
emacsのように独自の多言語コードに変換するのがスッキリしているみたいです。
FIXED PITCHという文化とWin(覗くXP)のフォントが憎くなってきました。
0020デフォルトの名無しさんNGNG
>>6
LOGFONTの説明を見れ。フォントマッパは指定されたサイズを越えない
最大のフォントを探すとある。だから、12ptと指定したなら最大のサイズは
12ptなんじゃないの? 論理単位で。
0021ねこまNGNG
CreateFile についてなのですが,以下に
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createfile.htm
1.ハードディスク x を開くには、lpFileName パラメータで \\.\PHYSICALDRIVEx と指定します
2.フロッピーディスク x や、ハードディスクのパーティション x を開くには、lpFileName パラメータで \\.\x: と指定します
と書かれています.

1.の,「ハードディスク x を開く」
2.の,「ハードディスクのパーティション x を開く」
という違いがわからないのですが,このあたり明るい方教えてください.
ここ読めとかでもいいです.

やってみると,うちでは
\\.\PHYSICALDRIVEx はハードディスクのすべてで失敗し,フロッピードライブである A と B で成功する
\\.\X: ハードディスクのすべてで成功する
となりました.
0022デフォルトの名無しさんNGNG
1.はMBRを含むハードディスク全体
2.はその中の各パーティション
どうして失敗するのかは知らん
0023デフォルトの名無しさんNGNG
>>21
\\.\PHYSICALDRIVE0 なら一台目のハードディスクという意味では
0024デフォルトの名無しさんNGNG
976 :デフォルトの名無しさん 本日のレス :02/09/21 11:21
>>970
Unicodeか・・・ちなみにギリシア文字(アルファとかベータとか)は全角だと思いますか?半角だと思いますか?
0025デフォルトの名無しさんNGNG
>>21
2. の方は日本語訳が間違ってるよ。英語版の方では...

When opening a volume or floppy drive, x, the lpFileName
string should be of the form \\.\x:.

となっていて、パーティションと言う言葉は出てこない。
参照: ttp://msdn.microsoft.com/library/en-us/fileio/base/createfile.asp

ただ日本語訳のほうもその後を読めば、\\.\X はドライブ指定であること
は、普通わかるはず。

失敗する時は、エラーコードぐらい示したら ?
どうせ、Windows 9x でやってるか、Windows NT の一般ユーザー権限で
やっていると言うオチだろうが...。
0026デフォルトの名無しさんNGNG
Win32APIの書籍でお勧めなのってありませんか?
0027ねこまNGNG
>>22さん
DISK_GEOMETRY の内容を表示すると,確かにそうですね!なるほど
同じハンドルしか返ってこないし

>>23さん
MSDN より
>\\.\PHYSICALDRIVE2
>ユーザーのコンピュータの 3 番目の物理ドライブのハンドルを取得します。
なのでその通りでした.勘違いしてました.

どうもありがとうございます.
0028デフォルトの名無しさんNGNG
>>26
Windows95 APIバイブル1,2
0029デフォルトの名無しさんNGNG
\\.\X: ハードディスクのすべてで成功する

と書いているのですから,読めばそんなオチではない事
は、普通わかるはずでは?
0030デフォルトの名無しさんNGNG
>>29
> 読めばそんなオチではない事は、普通わかるはずでは?
これは、Windows9x の方か ? 権限の方か ?
確かに Windows9x は、\\.\x もダメみたいだな。ちょっと勘違いしてた
よ。

でも、そんなことぐちゃぐちゃ言ってる暇あったら...
> 失敗する時は、エラーコードぐらい示したら ?
の方をやってみたらどうよ。
0031デフォルトの名無しさんNGNG
Windowの画面全体をメニューバー(マウスでドラッグすると移動できる)
みたいにするにはどうすればいいんでしょうか?

Tcalenderのようなメニューバーはなくて画面表示のみ、
それで、画面をクリックしながら動かせば移動が可能、とやりたいのです。
0032デフォルトの名無しさんNGNG
メニューバー?タイトルバー?
003331NGNG
すみません。
タイトルバーのことです。
タイトルバーもメニューもない、内容だけのWindowを作って、
なおかつそれをドラッグで移動させたいのです。
0034デフォルトの名無しさんNGNG
>>33
case WM_NCHITTEST: return HTCAPTION;
0035デフォルトの名無しさんNGNG
WM_NCHITTESTでHTCAPTIONを返す
FAQだな
003634NGNG
かぶった
0037デフォルトの名無しさんNGNG
>>16
NM_CUSTOMDRAWを調べよう。

>>33
WM_NCHITTESTに対して常にHTCAPTIONを返すとか。
003831NGNG
>>34さん、>>35さん、
できました!
2時間悩んでいたので感激です!!!
どうもありがとうございました。
003937NGNG
さらにかぶった。鬱。
004031NGNG
>>37さん、ありがとうございます。
FAQだったのですね。検索が甘く失礼しました。
0041デフォルトの名無しさんNGNG
>>11
そのxをどうやって求めるかを知りたいのですが・・・
0042デフォルトの名無しさんNGNG
>>41
xは自分が作りたいフォントのサイズなのだが。
0043デフォルトの名無しさんNGNG
>>42
いやあの、あるサイズのフォントを作りたいのでは無くて、高さを知りたいんです。
例えば12ptの任意のフォントで描画された文字列を矩形で囲むとしたら
その矩形の高さをどう求めたらよいのかということです。
矩形の高さはポイントによって固定したく、
12pt→RECT rc12;
13pt→RECT rc13;
 :
 :
と対応させて矩形を表します。
rc12内へ12ptサイズのフォントを表示させれば、どんなフォントでも上下が
はみ出さずに表示できるようにするには、rc12の高さをどう設定すればよいのでしょうか。 
0044デフォルトの名無しさんNGNG
>>43
ねぇねぇ、もしかしてポイントサイズからドットサイズへ変換する式がわからないとか言う話?
0045デフォルトの名無しさんNGNG
フォントサイズといえば、CreateFontのnHeightパラメータの説明、

0 指定された値をデバイス単位に変換し、それを利用可能な各フォントのセルの高さと比較します。
<0 指定された値をデバイス単位に変換し、その絶対値を利用可能な各フォントの文字の高さと比較します。

これ、思いっきり謎なんだけど、誰か解説出来る人いますか。
昔、本で高さには負数を入れろと書いてあったのを覚えているんだけど、
絶対値で比較されるなら差がないと思うんだけど、どうだんでしょ。
0046デフォルトの名無しさんNGNG
>nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

ちなみに、MSDNの例では負数を入れてますね。

旧スレが上がっているのでage
0047デフォルトの名無しさんNGNG
>>45
正だったらフォントの (* セル *) の高さ。
負だったらフォントの (* 文字 *) の高さ。

文字の高さ (em height としても知られている) とは、文字セルの高さ
から内部レディング (アクセント記号などのためのスペース) の高さを
引いたものです。
0048デフォルトの名無しさんNGNG
>>47
レスどうもです。
文字の大きさを基準にスペースを決定したい場合は負数で、
スペースを基準に文字を収めようとする場合には正の数ということですね。
0049デフォルトの名無しさんNGNG
>>48
ちょっと違う、 Á, Ö みたいにアクセント/ウムラウト等の文字の上につ
く記号のためのスペースを含むかどうか。(もちろん、文字としては含まな
い、セルとしては含まれる。)
ttp://amalfi.dis.unina.it/~carlosan/F3+BD/chap2/default.htm
の真中辺の Fig. 2-3 を参照のこと。
0050デフォルトの名無しさんNGNG
>>49
えっと、混乱してきました。
文字の高さ = otmMacAscent + otmMacDescent
セルの高さ = otmMacAscent + otmMacDescent + otmMacLineGap = tmHeight + tmExternalLeading
ですよね?

# 記号のスペースがtmInternalLeadingって事ですよね。
tmHeightにはtmInternalLeadingが含まれますが、
tmHeightを基準にするか(セル)、tmHeight - tmInternalLeading(文字)を基準にするかと言うことでしょうか?

そうだとすると、US ASCIIとかSJISの文字を表示するときはスペースの利用効率で負数を使って、
ウムラウト文字を含むような西欧文字を表示するときには正の数を使う、ってことですか。
0051デフォルトの名無しさんNGNG
最後の2行はなんか違う気がしてきました、
読み捨てて下さい
0052デフォルトの名無しさんNGNG
>>43
君がッ
LOGFONTのヘルプを見るまでッ
僕はッ
LOGFONTのヘルプを見ろと言うのをやめないッ!!
0053デフォルトの名無しさんNGNG
>>50
> セルの高さ = otmMacAscent + otmMacDescent + otmMacLineGap
> = tmHeight + tmExternalLeading
これは、違う。
セルの高さ = 文字の高さ + tmInternalLeading
 = otmMacAscent + otmMacDescent + tmInternalLeading
詳細は、
ttp://www.topposystem.co.jp/DL/Win32API/font/Font09.htm
の下のほうの図を参照のこと。
0054デフォルトの名無しさんNGNG
>>53
馬鹿におつきあい頂きありがとうございました。
それぞれの値が意味する物はわかりましたが、使い分けがさっぱりだったりします。
0055デフォルトの名無しさんNGNG
>>44
矩形の高さは
 MulDiv(m_nFontSize, pDC->GetDeviceCaps(LOGPIXELSY), 72)
で計算したのですがArial Blackなどの一部のフォントだと下が切れてしまうんです。
フォントは
 lf.lfHeight = -MulDiv(m_nFontSize, pDC->GetDeviceCaps(LOGPIXELSY), 72);
で高さを指定しています。

lf.lfHeightに入れる値を正数にすれば矩形内には収まりますが、
それだとワードパッドで表示した同じポイントのフォントより明らかに小さく描画されてしまいます。

というわけでこの方法ではうまくいかないものだと思い、ここで質問させていただきました。
0056デフォルトの名無しさんNGNG
それはつまりワードパッドと同じ大きさのフォントにすると下が切れるってことだろ
ここで聞いて解決するような問題なのか?
0057デフォルトの名無しさんNGNG
AGEテオキマス
0058デフォルトの名無しさんNGNG
クソスレageんなヴォケ
0059デフォルトの名無しさんNGNG
>>56
ワードパッド(に限らずIEや他のペイントソフトなど)と同じポイントを指定してるので
できれば同じ大きさで描画されて欲しいです。
0060デフォルトの名無しさんNGNG
スライダーコントロールの色を指定したいのですが、やり方がわかりません。
システム色ではなく、赤とか青とかいろいろな色で作りたいのです。
ご存知の方、教えてください。

よろしくお願いします。
0061デフォルトの名無しさんNGNG
Win95以降に使えるようになったコモンコントロールの
リファレンスみたいなのが載ってる本はないでしょうか?

MSDNはその部分日本語化されてないし、
ネットで探しても、ごく一部分だけの解説とかしか
見つからないのです。
0062デフォルトの名無しさんNGNG
検索しても見つからんなら大人しく英語版読むのが吉。
あと具体的にどのコントロールのことを知りたいのか書けば
知ってる奴が教えてくれると思う。
0063デフォルトの名無しさんNGNG
>>59
で、切れてもいいのか?
お前が何をやりたいのかさっぱりわからんのだが。
006461NGNG
たしかに、具体的にやりたいことがあってそのやり方が分からない
という時なら、それで事足ります。

でも、たまに暇な時に何となく説明を読んでたら
「おお、このコントロールにはこんな機能があったのか!」
みたいな便利機能発見して嬉しくなることができないなぁと。
0065デフォルトの名無しさんNGNG
>>61
MFCのドキュメント。
SDKとの対応がだいたい想像付く。その逆も。
006661NGNG
>>65
成程!
それは盲点でした。
ありがとうございます。
0067デフォルトの名無しさんNGNG
>>64
なんとなく読むだけの暇があるんなら最初から英語版に目を通せや・・
0068デフォルトの名無しさんNGNG
>>7
うまく出来ました!
とても参考になりました。
ありがとう。
0069デフォルトの名無しさんNGNG
>>63
切れないように。矩形内に収まるように。と書いてあるが。
0070デフォルトの名無しさんNGNG
自作でエディットコントロール見たいな奴を作ろうと思ったんですが、
WM_CHARを取ろうと思っても親にSendMessageしてもらわないとできません。
標準のエディットコントロールでは、そんなことせずにできるんですが、
どうやったらいいのでしょうか。
RegistClassあたりでそういうのがあるんでしょうか。
0071デフォルトの名無しさんNGNG
>>70
サブクラス化すればいいだけじゃないの?
007270NGNG
>>71
サブクラス化とは何でしょうか?
007370NGNG
>>72
そこまでバカではない。
>>71
エディットコントロールをですか?
それじゃ意味が無いような。
0074デフォルトの名無しさんNGNG
意味無いならやめろ。
0075デフォルトの名無しさんNGNG
>>70
ダイアログに置いてあるなら WM_GETDLGCODE をヘルプで見てみるとよいよ
自作のウィンドウクラスの中に置いてあるなら何もしないでも来るはず
007670NGNG
ありがとう御座います。見てみますね。
0077デフォルトの名無しさんNGNG
>>70
WM_GETDLGCODEあたりの問題ですか?
007877NGNG
げふぉ。
0079デフォルトの名無しさんNGNG
>>69
そしたらワードパッドと大きさが違ってくるんだろ。
ようするに要求が矛盾してるんだよ。
奴がやりたいことを整理して出直してくるまで放置だな。
0080デフォルトの名無しさんNGNG
>>79
やりたいこと。
・固定高の矩形内におさめる
・表示はワードパッドやIEで表示したものと同じ大きさで
これだけです。
この条件で「(矩形の高さの)上限は求められますか?」ということと、
「可能ならその方法を教えてください」というのが元の質問の意味です。
0081デフォルトの名無しさんNGNG
固定高にワードパッドやIEと同じ大きさというが、
固定高の高さによって表示が切れるのは当然だと思うが
0082デフォルトの名無しさんNGNG
上限があるかって質問なんだから「ありません。」で終わるやんか。
何をぐだぐだ言っとんねん。
0083デフォルトの名無しさんNGNG
まあ、アレだ。
その部分のソースを出せば解決するんじゃないのか?
0084デフォルトの名無しさんNGNG
http://www.forest.impress.co.jp/article/2002/09/20/goostick.html
こういうツールバーってどうやって作るの?
どこかに資料ありませんかぁ?
0085デフォルトの名無しさんNGNG
理論的には、unicodeの1〜10万いくつまでGetTextExtent32Wを
発行すればできるんでないか。まあ、表示文字列に対して
GetTextExtを発行した方が速いけどナ
0086デフォルトの名無しさんNGNG
何言ってるんだ?
0087デフォルトの名無しさんNGNG
ちょっと聞きたいのですが。
C言語でプログラムを書いたんですが、バックグラウンドで
動かす(MS-DOSプロンプトウインドウを出さないで動かす)には、どんなAPI
を使えばよいのでしょうか?
ご教授いただきたいですが^^
0088デフォルトの名無しさんNGNG
mainをやめてWinMainで作ればコンソール出なくなるよ
0089デフォルトの名無しさんNGNG
>>85
カーニングがあるからすべての2文字の組み合わせで
やらなければいけない≒事実上不可能
0090デフォルトの名無しさんNGNG
どこかにIMEで再変換するサンプルコードがありますでしょうか?
RECONVERTSTRING 構造体を「どーにか使う」というところまで辿りついたのですが、
まったく使用例が見つからず、肝心の「どう使うのか」が分からず行き詰まってしまいました。
どなたか、お助けいただけますでしょうか。
0091デフォルトの名無しさんNGNG
ウィンドウアプリケーションから
標準出力(coutとか)に文字列とか吐き出すと
どう処理されるんですか?
0092デフォルトの名無しさんNGNG
Win2Kですが、非同期シリアル通信で、
SetCommMask( ,0)で
別スレッドでの受信待ちのWaitCommEventをキャンセルしているのですが、
処理が戻るまでに数秒〜数十秒かかってしまいます。
なにか、心当たりある方いらっしゃいますでしょうか?
0093素人ですが。NGNG
教えて君ですみません。

過去にVBA(Access97)で組んだGetSaveFileNameの記述なんですが、Windows 2000になってから
動かなくなりました。
OPENFILENAME構造体が拡張されてサイズが変わったらしいこと、拡張された部分まではわかったんですが、
構造体の拡張部分をVBでどのように宣言したらいいのかわかりません。
つーのも、pvReservedがvoid*らしいのですが、VBにはどうやら該当するデータ型が見当たらないのです。
(試しにVariantで宣言したらダメでした。)
うまく動かないのは、ここの宣言が間違っているからと睨んでいます。
TypeからEnd Typeまでの記述はどうすればいいのでしょうか??
0094デフォルトの名無しさん NGNG
>>91
標準出力に相当するハンドルが標準では存在しないため、
未オープンファイルへ書いた場合と同様にEBADFとなる。
0095デフォルトの名無しさん NGNG
>>93
lStructSizeの値が76に設定されていれば、古い定義のままで動くはずだ。
どうしても新しいのが使いたければLongで宣言しておけ。
0096デフォルトの名無しさんNGNG
>>84
ttp://www.codeproject.com/useritems/toolband.asp
0097デフォルトの名無しさんNGNG
>94
了解しました
ありがとー
0098デフォルトの名無しさんNGNG
>89
カーニングは高さを変化さすのか?初耳だが。
0099デフォルトの名無しさんNGNG
>>92
その別スレッドの処理がものすごいことになってるのでは?
0100デフォルトの名無しさんNGNG
ソケット通信なんですが、
Java側で

 ObjectOutputStream oout = new ObjectOutputStream(socket.getOutputStream());
 PrintWriter out = new PrintWriter(new OutputStreamWriter(oout, "SJIS"));
 out.println("hogehoge");
 out.flush();

と送って来て、それを recv しているんですが、
文字化けしてしまいます。

unicode変換とかが必要なんでしょうか?
0101デフォルトの名無しさんNGNG
マルチポスト
http://pc3.2ch.net/test/read.cgi/tech/1016065855/893
■ このスレッドは過去ログ倉庫に格納されています