■過去ログ置き場に戻る■ 1- 前250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API【2】
751 名前:747=750 :02/02/23 11:41
http://www.microsoft.com/japan/developer/windows/techart/FixedPitchFont.asp
ここをみると、TextOut()で一気に一列書くのではなくて、
1文字ずつTextOut()して出力していかないといけないってことになるのかな?


752 名前:747=750 :02/02/23 12:02
個人メモみたいになっちゃってますが・・・
基本となるフォントを決めておいて、
TextOut()する前に、
::SetTextCharacterExtra(hdc, current_tm.tmAveCharWidth + base_tm.tmAveCharWidth);
とすればいいのかな???

753 名前:747=750 :02/02/23 12:03
s/+/-/

754 名前:デフォルトの名無しさん :02/02/23 21:05
>>751
しかし、1文字ずつだとカーニングが反映されないという諸刃の剣。

755 名前:デフォルトの名無しさん :02/02/24 03:03
Platform SDK Updateを使えば最新のドキュメントが手に入る
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

756 名前:デフォルトの名無しさん :02/02/25 00:10
.wmaのコンテンツプロパティ書き換える方法ってありますか?
別に怪しげなことをするのではなくタイトルのアルファベットを
全角->半角に変換したいのです。

757 名前:デフォルトの名無しさん :02/02/25 01:10
Delphiスレで反応がなかったので…ObjectPascalですけどやっていることは完全にAPIの世界なのでお許し下さい。

問題の現象は、事前に、コントロールパネルの中のタスクを調べておかないと、色々変になることです。
・コントロールパネルのフォントのFORPARSINGで得られるディレクトリ→GUID文字列
・コントロールパネルの管理ツールのFORPARSINGで得られるディレクトリ→GUID文字列
・コントロールパネルのネットワークの中身→空になる
・ごみ箱の中身のプロパティ→ごみ箱そのもののプロパティが出てしまう
当方Windows2000SP2, IE5.5なのですが、この動作が、一般的に起こり得るのか、うちの環境が変なのか知りたいのです。
というわけで、タスクを調べずにいきなりごみ箱の何れかの「中身」のプロパティが出せる環境の人いらっしゃいますか?

program Test;
uses Windows, ActiveX, ShlObj, ShellAPI, Demoのvirtuallistviewの関数を抽出したユニット;
const EnumOption = SHCONTF_FOLDERS or SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN;
var Desktop, Bitbucket, Folder: IShellFolder; Malloc: IMalloc; Enum: IEnumIDList;
 Menu: IContextMenu; Arg: TCMInvokeCommandInfo;
 ID, Item, It: PItemIDList; PMenu: HMENU; Got: DWORD;
begin
 SHGetMalloc(Malloc); SHGetDesktopFolder(Desktop);
 SHGetSpecialFolderLocation(0, CSIDL_BITBUCKET, ID);
 Desktop.BindToObject(ID, nil, IID_IShellFolder, Bitbucket); Malloc.Free(ID);
 Folder := Bitbucket; It := nil; Folder.EnumObjects(0, EnumOption, Enum);
 while Enum.Next(1, Item, Got) = S_OK do
  begin if It = nil then It := CopyPIDLs(Malloc, Item); Malloc.Free(Item); end;
 if It <> nil then begin
  Folder.GetUIObjectOf(0, 1, It, IContextMenu, nil, Menu);
  PMenu := CreatePopupMenu; Menu.QueryContextMenu(PMenu, 0, 1, 100, CMF_NORMAL); DestroyMenu(PMenu);
  FillChar(Arg, SizeOf(Arg), 0); Arg.cbSize := SizeOf(Arg); Arg.nShow := SW_SHOW; Arg.lpVerb := 'properties';
  Menu.InvokeCommand(Arg); Malloc.Free(It);
 end;
end.

758 名前:初心者01 :02/02/26 02:46
ウィンドウ初期化をソース分割してコンパイルできないッス

プロシージャ系が駄目みたいなんですがどうやったらいいでしょう?

ウィンドウ構築の関数とプロシージャの部分が一緒のソースにあると
成功するんですが、これは分けられないでしょうか?

759 名前:デフォルトの名無しさん :02/02/26 08:51
質問です。

現在実行中のアプリケーションの実行ファイルのサイズを求めるにはどうしたら
良いのでしょうか?対象のファイルは他のプロセスの実行ファイルです。

CreateFileの引数を色々と変えてみましたが、ファイルをオープンできませんでした。

・・・もしやと思ってFindFirstFileを使ってみたらサイズが取得出来ました。
すみません、自己解決しちゃったようです^^;

もし、もっと良い方法があれば教えてください。

760 名前:デフォルトの名無しさん :02/02/26 10:52
>>759
ReadOnly-NonExclusiveで開いてもだめ?

761 名前:759 :02/02/26 12:08
>>760
もちろんそれも試しましたが駄目でした。
dwAccessを0にしても駄目でした。

とりあえず、FindFirstFileを使った方法は、98、Me、2000、XPで問題無く
動いているようです。
もっとストレートに取得する方法あればいいんだけど。

762 名前:デフォルトの名無しさん :02/02/26 16:19
>>761
エディタとかでごく普通に開けるようだが?
指定を間違えてるに一票。

763 名前:デフォルトの名無しさん :02/02/26 19:30
>>761
GetLastError()は試したか?

764 名前:デフォルトの名無しさん :02/02/26 19:31
DLLのエントリポイントのアドレスを取得する方法ありませんか?

765 名前:デフォルトの名無しさん :02/02/26 20:05
すみません、質問です。

バックサーフェス(back_dc)からフロントサーフェス(hdc)へ転送するときに、
子供ウィンドウがちらついてしまうのですが、ちらつかないようにする
対策方法を教えていただけませんか?


BitBlt(hdc, 0, 0, 32, 32, back_dc, 0, 0, SRCCOPY);
このように転送する際、親ウィンドウ内の子供ウィンドウがちらついてしまうんです。

766 名前:デフォルトの名無しさん :02/02/26 20:09
WS_CLIPCHILDREN

767 名前:デフォルトの名無しさん :02/02/26 23:46
>>764
そんなAPIはない。
そのDLLのモジュールハンドルでCOFFヘッダ見ろ。


768 名前:759 :02/02/27 01:38
すんまそん。何故か今やったらCreateFileで開けました。
っていうか、なんで朝はできなかったんだろう?

769 名前:デフォルトの名無しさん :02/02/27 06:22
CreateWindow()での部分で止まる理由ってなんでしょうか?

コンパイルは通るのに(レベル4)メッセージボックスで順に調べていくと
そこで止まってます。

なぜ?

770 名前:デフォルトの名無しさん :02/02/27 09:49
止まるって、そこで終了しちゃうってこと?
ウィンドウプロシージャのWM_CREATEは何返してる?

771 名前:デフォルトの名無しさん :02/02/27 21:59
>769
GetLastErrorってご存じ?
ちなみにファーイーストリサーチ社の調べによると、CreateWindowで
失敗する原因の第1位はウィンドウクラス名の間違い。

772 名前:757 :02/02/27 22:05
自己レス。結局CoInitializeはスレッド毎に必用なのでありました。

…ということは、他のスレッドで取得したIMalloc, IShellFolderなどを
別のスレッドから使用するのは危険な気がしてきた…。

今、おもいっきりそーゆー処理してます。一応動いてますけど…。

773 名前:769 :02/02/28 00:58
>>770
>>771
サンクスです。
多分クラスの構築の仕方に問題あったようです。
初期化の段階でここまでこけまくるとは。。。。。

今はプロシージャからメンバ関数呼べるようにしてるところです。
動いてますけどコピペなので解読中なのですが。。。
LPARAM、CREATEWINDOW、WM_CREATE って親戚みたいなもんなんですね。
ヘルプで追ってて初めて気付いた。。。。



774 名前:デフォルトの名無しさん :02/02/28 01:09
なんで”名前空間”と言うのでしょう?
さっぱり分かりません。

775 名前:デフォルトの名無しさん :02/02/28 01:09
俺は逆参照のがわけわかめ

776 名前:デフォルトの名無しさん :02/02/28 02:03
名前に支配された空間だから。
名前空間の中では、識別子の解決法が名前に支配される。

魔空空間と似たようなもんだ。


777 名前:デフォルトの名無しさん :02/02/28 08:51
>>771
いながきメンバーがそう言ったのか?

778 名前:デフォルトの名無しさん :02/02/28 11:41
>>772
「Apartment」でMSDNライブラリを検索してみれ。

779 名前:デフォルトの名無しさん :02/02/28 11:55
>>778
それだと使えないコンポーネントがあるが。
IEとかIEとかIEとか

780 名前:デフォルトの名無しさん :02/02/28 13:16
ウィンドウ作成直後の表示状態についての質問です。

CreateWindow(Ex) でウィンドウを作成時に WS_VISIBLE を設定しないと
非表示状態でウィンドウが作成されますよね?
ところがこの時 GetWindowPlacement して取得した
WINDOWPLACEMENT.showCmd に SW_SHOWNORMAL が入っているんです。
それを使ってそのまま SetWindowPlacement すると、ウィンドウが表示されてしまいます。

何か根本的に間違っているのでしょうか?

ウィンドウのクライアント領域のサイズを変更してからウィンドウを表示したいので、
ウィンドウ作成→ウィンドウの幅設定→クライアント領域の幅を取得→
設定した幅からの誤差を計算して、望んだクライアント領域の幅になるようにウィンドウの幅を設定→
ウィンドウの表示

という事をやっているのですが、はじめのウィンドウの幅設定の時点で
すでにウィンドウが表示されてしまっているのです。

この設定&取得はほかの部分でも使っているので、現在ウィンドウが表示されているか
されていないかにかかわらず正常に動作させたいのです。

どうすればいいでしょうか?よろしくお願いいたします。

781 名前:コーダーさん ◆FGThHbRk :02/02/28 14:51
AdjustWindowRect使えばもっと簡潔になると思われ。
http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_adjustwindowrect.htm

782 名前:780 :02/02/28 15:51
自己レスですが、一応対処策を考えました。
WS_VISIBLE を調べて SetWindowPlacement の際に showCmd をいじくれば
とりあえずは ok そうです。

>>781
ありがとうございます。こっちの方がこの場合には適切ですね。

783 名前:さくさく :02/02/28 19:25
すみませーん、どなたか教えてください。

VBとか他の4GLとかで外部関数(DLL)インターフェースを持つ言語で作ったWinのアプリからMAPIを使用してMicrosoftのMailerから受信したMailを見たいのですが、
OutlookのMailの本文を取得するとencodeがかかったリソースのまま取得してしまいます。
MSFCのインタフェース(DLL)で、encodeタイプを指定したら2バイトコードに変換してくれるようなものってご存知ないですか?(decoder?)
ちょっと調べてみたのですが、分かりませんでした・・・
よろしくお願いしますっっっ

784 名前:デフォルトの名無しさん :02/02/28 19:51
指定したフォルダ内の(サブディレクトリも含めて)
テキストファイルの総行数をレポートするような
ソフトありませんか?
プログラムのソースコードの規模を見る目安に用いたいと思っています。

よろしくお願いします


785 名前:デフォルトの名無しさん :02/02/28 20:07
>>784
Cygwin あたりの UNIX 由来のコマンドを使えれば、こんな感じか。

wc -l `find -iregex '.*\.\(cpp\|c\|h\|hpp\)'`

ファイル数が多い場合には `` で済ませずに、個々のファイルについて wc して
合計を足すようなスクリプトを awk, perl あたりで書いたほうがいいかも。

786 名前:784 :02/02/28 20:37
>>785
ありがとうございます
でもWindows上で実行できるGUIのある普通のソフトが理想です


787 名前:デフォルトの名無しさん :02/02/28 20:47
>786
ソフトを探しているのなら、こちらで聞いてみては?

***すれ立てるまでもない質問はここで 第11刷***
http://pc.2ch.net/test/read.cgi/tech/1014478527/

788 名前:デフォルトの名無しさん :02/02/28 21:35
>786
>でもWindows上で実行できるGUIのある普通のソフトが理想です
ふむ。つまり、VC++あたりでwcを開発したい、と。

789 名前:デフォルトの名無しさん :02/02/28 21:47
>>786
あまりに単機能なプログラムなので、わざわざ個別のアプリケーションとして
作ってるやつはいないんじゃないかと。

GUI でまじめにややろうとすると、

- 含める拡張子のパターン
- 除外するディレクトリ
- ファイルの改行コード

とか、細細した設定用のダイアログやら何やらも必要になって、目的の割に
面倒なことになりそうだし。

790 名前:デフォルトの名無しさん :02/02/28 23:51
初心者です、よろしければアドバイスお願いします
APIのCreateThreadを使ってスレッド関数を呼びたいのですが、
スレッド関数をクラスのメンバとして宣言して
class hoge {
  public:
    DWORD WINAPI ThreadFunc(LPVOID lpparam);
};
というように書いてCreateThread()からスレッド開始する方法って
無いのでしょうか?
この場合、引数に関数名書くだけではダメですよね・・・
思いつく限り色々やってはみたのですが出来なかったので、
よければ教えてください

791 名前:FAQデスナ :02/03/01 00:05
class hoge{
public:
DWORD ThreadFunc();
};

DWORD ThreadFunc(LPVOID lpparam)
{
((hoge*)lpparam)->ThreadFunc();
}

で CreateThread に、グローバルの方の ThreadFunc と、hoge のアドレスを渡す。

792 名前:790 :02/03/01 00:19
>>791
おお、ありがとうございます助かりました!
とりあえず書いてみます〜!

793 名前:デフォルトの名無しさん :02/03/01 01:01
プロパティーシートでOKを押した時に設定値の変更するのに
WM_NOTIFY メッセージ内で((NMHDR*)lParam)->code が
PSN_APPLY になったときに処理するようにしたのですが、
プログラム全体が変になるのです。例えば文字の配列が
一バイトずれるなど。困ったことに変更データとまったく関係
のない所に影響を及ぼすらしく原因が分からないのです。
そこでPSN_KILLACTIVEで処理するように書き直してみたら
問題なくうまくいきました。この変な現象の原因は何だった
のでしょうか。

794 名前:757=772 :02/03/01 03:09
>>778どうもです。
で、COMの作成や登録は今回は使う側なのでパスして
最終的にCOINITに行き着いたのですが、

要するに CoInitializeEx(nil, COINIT_MULTITHREADED) して
クリティカルセクションか何かで同期して呼んでやれば、
COMオブジェクトを取得したスレッド以外のスレッドからでも、呼べる、
と、この理解で合ってますか?

795 名前:757=772 :02/03/01 03:43
でも、同時にOLE Drag&Dropも必用なんでOleInitializeを呼ばなきゃいけないんです。
OleInitializeはCoInitializeExをCOINIT_APARTMENTTHREADEDで呼ぶと書いてあるし、
どうすればいいのでしょうか?

796 名前:769 :02/03/01 05:15

だれかCREATESTRUCTについて語ってください。


797 名前:デフォルトの名無しさん :02/03/01 05:35
>>794
そうですか?
おれも詳しくないけどさ。


798 名前:デフォルトの名無しさん :02/03/01 06:48
>796
ソースうぷすればいい。

799 名前:デフォルトの名無しさん :02/03/01 15:04
Windows でのプロセス間通信の方法には共有メモリ以外に
どんな方法がありますか?
できればストリーミングみたいな感じでやりとりしたいのですが…

800 名前:デフォルトの名無しさん :02/03/01 15:11
>>799
WinSock, Pipe, COM

> できればストリーミングみたいな感じでやりとりしたいのですが…

- 送る側と受け取る側は非同期に動く
- データは FIFO

ということ? それだと、ふつーは Pipe じゃないかな。CreatePipe() あたりの
API をチェック。

801 名前:799 :02/03/01 15:34
>>800
なるほど、そういえばソケットもプロセス間通信に使えるんですね。
でもパイプをちょっと試してみようと思います。
ありがとうございました。

802 名前:デフォルトの名無しさん :02/03/01 15:37
TextOutWで、文字列を出力しよう、と思っています。
DCにBindされたフォントで、その文字列がきちんと
表示できるのかはどうやって判断するのですか?

やっぱり、コード毎にフォントを変えて出力しないと
いけないのでしょうか?

803 名前:デフォルトの名無しさん :02/03/01 18:28
>>802
WinNT系なら GetFontUnicodeRanges() API で。
Win9xだと…わからん。

804 名前:デフォルトの名無しさん :02/03/01 19:15
Win9xでもTextOutWって実装されてたっけ?
実装されてたとしても多言語を同時に出力できるような仕様になってないから
気にする必要ないとか

805 名前:デフォルトの名無しさん :02/03/01 19:29
えー。Win9x でも TextOutW は使えます。しかし文字ごとに適切なフォントを選ばなくちゃなりません。2000 以降では、現在のフォントで表示できない文字は、勝手にフォントを選んでくれます。たしか。

あるフォントで、ある文字が表示できるかどうか調べるには、GetFontData を使ってフォントファイルを読み取って調べるコードを自分で書かないといかんです。とても面倒。検討を祈る。

806 名前:デフォルトの名無しさん :02/03/02 04:50
Windowsのlinkerやloaderに関して詳しい資料はないでしょうか?
何か詳しいWebサイトなんかがあれば教えて下さい。

807 名前:デフォルトの名無しさん :02/03/02 09:08
Windowsのlinkerってなんだ?

808 名前:デフォルトの名無しさん :02/03/02 10:47
むしろ loader の方が、何の事か聞きたい。

809 名前:デフォルトの名無しさん :02/03/02 12:26
>>806
書籍「Linkers & Loaders」じゃないのか、やっぱり。

>>808
そりゃ、実行ファイルをメモリに展開して実行できるようにする仕組みだろ。
DLL 使ってる場合とか、DLL にアドレスを割り付けて relocation する過程
などの詳細を知りたくなることもある。

810 名前:デフォルトの名無しさん :02/03/02 14:30
DLLじゃない独自のプラグインとか作ろうとするとLoaderの知識が必要になるよね。
漏れは面倒だからいつもDLLにしちゃうけど。DLLマンセー

811 名前:デフォルトの名無しさん :02/03/03 00:53
本買う必要なし
http://www.iecc.com/linker/

812 名前:API初心者の名無しさん :02/03/03 00:57
すいません、質問があります。

フロッピーやPCカードなどのボリュームシリアルを変更しようと思うのですが、
そのAPI関数がわかりません。

ヒントでいいので教えてください。

813 名前:デフォルトの名無しさん :02/03/03 01:05
>>812
SetVolumeInformation()


814 名前:API初心者の名無しさん :02/03/03 01:07
>>813
ありがとうございました。

あとはMSDNで調べます。

815 名前:API初心者の名無しさん :02/03/03 01:15
>>813

申し訳ございません。

MSDN調べたんですが、載ってなかったんで、
サンプルか詳細を教えて頂けませんか?

サンプルURLでも結構ですので。

816 名前:デフォルトの名無しさん :02/03/03 06:33
>>812
使ったことないからよくわかんないけど SetVolumeLabel っていう API があるみたいだよ。

817 名前:デフォルトの名無しさん :02/03/03 13:14
SetVolumeLabel ではボリュームラベルは変更できるけど
ボリュームシリアル番号は変更できないっぽい

818 名前:デフォルトの名無しさん :02/03/03 14:26
ファイル名をフルパスで渡したら、そのファイルが存在するかどうかを
判定してくれるAPIってありませんかね?
いまのところ、CreateFileでリードオープンしてみて成功なら
存在する、ってやってますけど、なんかAPIであった方が
安心できるんですが…。

819 名前:デフォルトの名無しさん :02/03/03 14:33
>>818
FindFirstFile

820 名前:デフォルトの名無しさん :02/03/03 14:33
>>818
GetFileAttribute とか?

821 名前:818 :02/03/03 14:53
>>819-820
回答、ありがとうございます。

GetFileAttributesで受け取ったDWORD値を判定するのが
よさそうですので、そうします。

822 名前:デフォルトの名無しさん :02/03/03 19:21
>>818
PathFileExists
ただしIE4.0以上がないと使えない。

823 名前:818 :02/03/03 20:21
>PathFileExists
うわー、まんまのAPIがあるんですね。
検索してみたんですけど、これって日本語のMSDNライブラリには
載ってない…。英語の方にはあったけど。
はぁ…普段から英語の方を使うようにした方がいいですかね?

ところで、最初っから「ファイル 存在 判定 API」でグーグレば
すぐに分かることでした…<判定用のAPI
それすらせずに聞いてた自分に気づいて、ちょっと鬱。
回線切って首つってきまーす。

824 名前:デフォルトの名無しさん :02/03/04 01:34
正直、ファイルの存在判定ごときでIE4を要求してほしくない

825 名前:デフォルトの名無しさん :02/03/04 01:40
GetFileAttribute でええやん。
一発やん。


826 名前:ゾーナム :02/03/04 09:33
>>824-825
いや、俺もIE4を要求したいとは思ってませんので、PathFileExistsは、
その存在を知った、というだけにとどめておきますよ。実際に使うのは
GetFileAttributesの方です。

827 名前:818(=826) :02/03/04 09:35
ぎゃふー! 別板のコテハンで書いちゃった!
恥ずかしい…。

828 名前:デフォルトの名無しさん :02/03/04 11:22
UTF-16をs-jisにしたいのですが、WideCharToMultiByte()でいけるのでしょうか?
何度か試したのですが、うまく変換できないようで・・・。


829 名前:デフォルトの名無しさん :02/03/04 13:10
SetThreadLocaleしてあれば、失敗する理由はとくにみつからんのだがな。
バイトオーダーが違うとか、そっち系の問題じゃないの?



830 名前:デフォルトの名無しさん :02/03/04 16:06
>>828
GetLastError() 夜露死苦!


831 名前:デフォルトの名無しさん :02/03/04 16:10
その部分のコードをだせといいたい。

832 名前:デフォルトの名無しさん :02/03/04 16:17
お騒がせしました。
GetLastError()してもエラーではなかったので変だと思ったのですが、
ご指摘のとおりバイトオーダーで駄目だったようです。
bomが付いてるからいけると思ってた私が馬鹿でした。

833 名前:デフォルトの名無しさん :02/03/07 11:03
WM_KEYDOWN の lParam の情報って↓こんな感じであってますか?
試してみたんですけど、本当にこれでいいのかどうかわかりません。

  short nRepeat = (lParam & 0x0000FFFF);
  char nScanCode = (lParam & 0x00FF0000) >> 23;
  bool bExtendedKey = (lParam & 0x01000000) >> 24;
  bool bAltKey = (lParam & 0x20000000) >> 29;
  bool bPress = (lParam & 0x40000000) >> 30;
  bool bUp = (lParam & 0x80000000) >> 31;

834 名前:デフォルトの名無しさん :02/03/07 11:36
>>833
nScanCodeを得るには16bitシフトではないのか。

835 名前:833 :02/03/07 16:21
>>834
そうでした^^;ありがとうございます。

836 名前:デフォルトの名無しさん :02/03/08 12:56
今非同期シリアルI/Oのプログラムやってて、
MSDNサンプルのTTY.Cを参考にしてるんですけど、
あのアプリって何をするものなのでしょうか?
ソースの前に、あのアプリの使い方がわからんです。

837 名前:デフォルトの名無しさん :02/03/08 15:11
ウィンドウのクライアント領域の デスクトップ上の 座標を取得したいんですけど
何か方法はないでしょうか?

GetClientRect は幅と高さしか返してくれなくて、座標は ( 0, 0) になってしまうようなのですが・・・。

838 名前:デフォルトの名無しさん :02/03/08 15:17
GetWindowRect()

839 名前:837 :02/03/08 15:28
>>838
ありがとうございます。
でもこれだとウィンドウの座標とクライアント領域のギャップが取得できないです。
このギャップはどうやって求めたらいいでしょうか?

840 名前:デフォルトの名無しさん :02/03/08 15:37
ScreenToClient()
ClientToScreen()

841 名前:デフォルトの名無しさん :02/03/08 18:04
.rcファイル中で
#define FOO "def"
LTEXT "abc"FOO"ghi", ...

と書くと abc"def"ghi のように余計な " が付いてしまいます
これを abcdefghi と表示するにはどうすればよいのでしょう?

842 名前:839 :02/03/08 18:57
>>840
ClientToScreen()で(0, 0)で望んでいた値を取得できました。
ありがとうございました。

843 名前:デフォルトの名無しさん :02/03/09 02:18
ビットマップの形式による描画速度の差は
環境によって違いがあるんでしょうか。

(画面32bit)
DDB >>> 8bit > 16bit≒32bit > 24bit

(画面16bit)
DDB >>> 8bit > 16bit > 24bit > 32bit

↑うちの環境ではこのような感じです。

DDBは加工しづらいし8bitじゃ色数が足りないんで
そこそこ速い16bitを使おうと思っているんですが、
環境によってこの順位は変わったりするんでしょうか。


844 名前:デフォルトの名無しさん :02/03/09 06:32
変わったりしまくります。

845 名前:デフォルトの名無しさん :02/03/09 23:44
>>844
そうでしたか。
それなら扱いやすさだけを考えて32bitにしようかな。

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


846 名前:デフォルトの名無しさん :02/03/11 17:19
ウィンドウが通常、最大化状態、最小化状態のどれかを取得する API ってありますか?

847 名前:デフォルトの名無しさん :02/03/11 17:29
IsIconic関係とか、GetWindowPlacementとか。

848 名前:846 :02/03/11 19:22
>>847
IsIconic でしたか、ありがとうございます。
95以前からあるAPIは名前の雰囲気から探すの難しいです。

849 名前:デフォルトの名無しさん :02/03/12 00:04
>>848
そろそろAPIバイブルを買って前ページ読破してもよい時期だな。
嫁。
嫁。
嫁。
昔はたったの800APIしかなかったから簡単だった。


850 名前:デフォルトの名無しさん :02/03/12 00:45
Win2k(SRP1)でsetForegroundWindowでフォーム(VB6)を最前面に持ってきたいんで、いろんな所で紹介されているように
ForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), 0)
TargetID = GetWindowThreadProcessId(HWND, 0)
で最前面とフォームのID取ってきて、
AttachThreadInput(TargetID, ForegroundID, True)
でアタッチして
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)
でロック時間0にして、
BringWindowToTop(HWND)
SetForegroundWindow(HWND)
とやっているのですが、コマントプロンプトが最前面の時には最前面になってくれません。何ででしょうか?


851 名前:デフォルトの名無しさん :02/03/12 00:58
>>850
それは、君がタコだから

852 名前:デフォルトの名無しさん :02/03/12 01:05
いろんなとこで紹介してるやつに聞け

853 名前:デフォルトの名無しさん :02/03/12 02:59
Explzhとかをインストールすると、エクスプローラでも
アーカイブにファイルをD&Dできるようになりますよね。
アレってどうやってるんでしょうか?

自分のアプリでエクスプローラと同じ挙動をさせたいのですが、
シェルエクステンションとか調べればできるようになりますか?

854 名前:デフォルトの名無しさん :02/03/12 11:16
> SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)
> でロック時間0にして、
はやめれ。

855 名前:デフォルトの名無しさん :02/03/12 23:33
>>853
OLE D&Dを調べれ。

856 名前:タコ :02/03/13 06:39
どうもコマンドプロンプトはそういう物らしい……と思ったら、
弄くってるウチになんとかなった。
>>854
先にSPI_GET〜で現在の値を保存しておいて、後でSETしなおしてますが。


857 名前:デフォルトの名無しさん :02/03/13 09:10
>>856
Windowsはマルチタスクだ。保存してから元に戻す間に
別のプログラムが設定をいじったら破綻するだろ。

858 名前:デフォルトの名無しさん :02/03/13 10:02
EDITTEXTにFocusが来たとき、すべて選択されるのを
防ぐにはどうしたらいいんでしょう?
環境はBCC5.5 + Win2kです。

859 名前:デフォルトの名無しさん :02/03/13 13:16
>>855
なんでOLEなんですか?
アプリケーションにDnDをするのではなくて、
デスクトップ上のアイコンにDnDできるんです

860 名前:デフォルトの名無しさん :02/03/13 14:08
>>859
エクスプローラもアプリケーションですが…

ドラッグ&ドロップでのオブジェクト転送については、
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_programming/transferring/transfer.asp
あたりが参考になるかと。

861 名前:デフォルトの名無しさん :02/03/13 14:21
あれはargvとかそーゆーのなのでわ。

862 名前:デフォルトの名無しさん :02/03/13 14:36
受け側はDragAcceptFiles()を呼んでおいてWM_DROPFILESを待つだけだけど、
送り側はちょいと面倒かも。

863 名前:デフォルトの名無しさん :02/03/13 14:45
>>858
 全て選択されるのは、Windows の標準動作。
 なので、防ぐんじゃなくて、自分でその選択を消すと考える。

 その EDITTEXT にフォーカスが来た時(EN_SETFOCUS が飛んできたとき)に、
EM_SETSEL メッセージを投げる。


864 名前:デフォルトの名無しさん :02/03/13 14:46
>>853
つまり、エクスプローラで、
1.txt, 2.txtとかのファイルをドラグしていって、
a.zipというファイルに対してドロプし、
追記相当の処理をさせたい、と。

865 名前:デフォルトの名無しさん :02/03/13 16:16
>>836
case IDD_TEXT:
if(HIWORD(wParam) == EN_SETFOCUS){
SendDlgItemMessage(hdwnd, IDD_TEXT, EM_SETSEL, 0, 0);
return 1;
}
で、いきましたthx!

866 名前:デフォルトの名無しさん :02/03/13 16:17
>>864
えっと、Explzhと同じことがやりたいのではなくて、
エクスプローラ側と同じ動作をさせたいのです。
zipがDnDを受け取るようになっていたら
自分のアプリでもzipへのDnDを許す、みたいな。


867 名前:デフォルトの名無しさん :02/03/13 16:59
>>866
「Shell Extension」「Drag Drop Handler」あたりで検索してみろ。

868 名前:デフォルトの名無しさん :02/03/13 18:01
>>856 >>857
> SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)
は、Win98以降で強制的に SetForegroundWindowする場合の常套手段だけど、
行儀は悪い。まぁ仕方ないのかも。

>>866
俺もシェルエクステンション初心者だから間違ってるかも知れんが、
レジストリの HKCR->.zip のクラス名(と言うのか?)->shellex->DragDropHandlers
に有効な CLSIDが登録してあれば、シェルで D&Dを受け付けると思われ。

869 名前:デフォルトの名無しさん :02/03/14 10:03
>>868
そもそも強制的にフォアグラウンドを奪うこと自体行儀が悪いんだから
多少の行儀の悪さは誤差の範囲なのかもな。

870 名前:デフォルトの名無しさん :02/03/14 23:31
>>869
稀に、複数プロセスで1つのアプリケーションを構築した場合なんかは、
仕方なく使うんだけどね。

871 名前:デフォルトの名無しさん :02/03/15 01:02
通知メッセージ(WM_NOTIFY)のリフレクション機構はどう作ればよいのでしょうか?
MFCだとメッセージマップみたいのでマクロ一発で済むみたいなんですが。

さすがに親Windowフックしてメッセージ投げ返してやるんじゃスマートじゃないし・・・。

872 名前:デフォルトの名無しさん :02/03/15 01:26
case WM_NOTIFY:
HWND hwndCtrl = (NMHDR*)lp->hwndForm;
 if (hwnd != hwnd)
  return ::SendMessage(hwnd, msg, wp, lp);
 ;
 break;


こういうんじゃないの?

873 名前:デフォルトの名無しさん :02/03/15 01:27
s/hwnd != hwnd/hwnd != hwndCtrl/

874 名前:デフォルトの名無しさん :02/03/15 01:46
ってことはあれですね、やっぱ親Windowのウィンドウプロシージャが必要ってことですよね。
メッセージリフレクションは、親Windowに手を入れなくていいというのが利点だ!ってMSDNに
書いてあったんで・・・。自前で書くならやむなしなのかもしれません。

875 名前:デフォルトの名無しさん :02/03/15 09:27
>>872のようなコードが親ウィンドウのウィンドウプロシージャに
あらかじめ書いてるかどうかの違いに過ぎないと思うんだが?
一度書いておけばそれ以上いじる必要ないだろ。

876 名前:デフォルトの名無しさん :02/03/15 10:50
すみませんが、IME関連で質問させてください。
ImmRegisterWordで文字列を登録させる処理なのですが、
IMEがデフォルトで登録してある語句をダブって登録させようとすると
関数が登録失敗で返してきます。
(例 語句”漢字”、よみ”かんじ”、品詞”名詞”)
失敗は良いのですが、その後エラーを取りたいのです。
MSDN等には、ImmGetGuideLineで取得できるとあります。
実際その処理を組み込んだのですが、戻り値がゼロで返却され
エラー内容を取得できないのです。
ガイドラインの情報タイプは”GGL_LEVEL”と”GGL_INDEX”で試してみました。
MSDNには
通常、アプリケーションはIMN_GUIDELINEメッセージを受け取った後に
この関数を呼び出します。と記載されてますが、
このメッセージがエラーが発生した際通知されないです。
もちろんWM_IME_NOTIFYのwParamで見てますよ。
詳しいかたよろしくお願いいたします。


877 名前:デフォルトの名無しさん :02/03/15 12:40
>>875
既存のコントロールの子としてウインドウを作ったら、
その既存のコントロールをサブクラス化したりしないといけないからって話じゃないか?

878 名前:デフォルトの名無しさん :02/03/15 14:06
>>877
それはMFCだって同じだろ?
単にMFCが自動的にやってくれるかどうかの違いだけで

879 名前:874 :02/03/15 14:44
えー、言いたいことは>>877さんと同じです。
要するに、こんな便利な機構がWin32APIセット自体には含まれていないんだなーって
ことです。ウィンドウスタイルにリフレクションを行う、なんてのがあれば結構使える
と思うんですが。

880 名前:デフォルトの名無しさん :02/03/15 16:35
リフレクションが便利な機構なんじゃなくて、
親に通知するという仕組みが糞なだけじゃないか?

881 名前:874 :02/03/15 20:05
ほかのウィンドウシステムをほとんど知らないんでなんともいえませんが、
自分自身へのnotifyがデフォルトで、親に通知するメッセージを(簡単に)選べる
方がスマートなのかもしれません。浅はかな考えですけど。

882 名前:デフォルトの名無しさん :02/03/15 21:05
親に全部通知するっていう仕組なら、親ウィンドウのウィンドウプロシージャだけ
書けば済むから、普通だったらそっちの方が楽。糞というほどのことはないと思う。
サブクラス化とか絡まない限りにおいては、だけどね。

883 名前:874 :02/03/16 00:24
リストビュー(レポートビュー<WinMXみたいの)のヘッダをドラッグすると
カラムの順番を入れ替えたりできます。
ヘッダの境界線をドラッグすると幅を変更できます。

これらを検出できないでしょうか・・・。LVN_*はなさげです。

884 名前:874 :02/03/16 00:24
age

885 名前:デフォルトの名無しさん :02/03/16 00:28
>>874
HDN_*にありそうだけど。

886 名前:874 :02/03/16 01:21
ヘッダーコントロールなんて初めて知りました・・・。
それからヘッダーコントロールの親がリストビューだということに気づくまでに
数十分。しばし格闘してみましたが、HDN_BEGINDRAGとHDN_ENDDRAGはつかまえ
られました。

しかし!境界をドラッグするのがつかまえられません。HDN_*はすべてハンドリング
してるのですが、それ以外のWM_NOTIFYが来てるようです。試しにHDN_*以外のすべて
のWM_NOTIFYに対してTRUEを返してみたら、境界ドラッグを防ぐことができました。

spy++でウォッチしてみたんですが、WM_NOTIFYであることしか教えてくれないんで
どうしようもなくなってしまいました。ヘルプ!

887 名前:874 :02/03/16 01:54
仕方なく来た通知メッセージの値から逆にたどりました・・・。
commctrl.hからの抜粋です。

#define HDN_ITEMCHANGINGA (HDN_FIRST-0)
#define HDN_ITEMCHANGINGW (HDN_FIRST-20)
#define HDN_ITEMCHANGEDA (HDN_FIRST-1)
#define HDN_ITEMCHANGEDW (HDN_FIRST-21)
#define HDN_ITEMCLICKA (HDN_FIRST-2)
#define HDN_ITEMCLICKW (HDN_FIRST-22)
#define HDN_ITEMDBLCLICKA (HDN_FIRST-3)
#define HDN_ITEMDBLCLICKW (HDN_FIRST-23)
#define HDN_DIVIDERDBLCLICKA (HDN_FIRST-5)
#define HDN_DIVIDERDBLCLICKW (HDN_FIRST-25)
#define HDN_BEGINTRACKA (HDN_FIRST-6)
#define HDN_BEGINTRACKW (HDN_FIRST-26)
#define HDN_ENDTRACKA (HDN_FIRST-7)
#define HDN_ENDTRACKW (HDN_FIRST-27)
#define HDN_TRACKA (HDN_FIRST-8)
#define HDN_TRACKW (HDN_FIRST-28)
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFOA (HDN_FIRST-9)
#define HDN_GETDISPINFOW (HDN_FIRST-29)
#define HDN_BEGINDRAG (HDN_FIRST-10)
#define HDN_ENDDRAG (HDN_FIRST-11)
#endif

#ifdef UNICODE
#define HDN_ITEMCHANGING HDN_ITEMCHANGINGW
#define HDN_ITEMCHANGED HDN_ITEMCHANGEDW
#define HDN_ITEMCLICK HDN_ITEMCLICKW
#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKW
#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKW
#define HDN_BEGINTRACK HDN_BEGINTRACKW
#define HDN_ENDTRACK HDN_ENDTRACKW
#define HDN_TRACK HDN_TRACKW
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFO HDN_GETDISPINFOW
#endif
#else
#define HDN_ITEMCHANGING HDN_ITEMCHANGINGA
#define HDN_ITEMCHANGED HDN_ITEMCHANGEDA
#define HDN_ITEMCLICK HDN_ITEMCLICKA
#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKA
#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKA
#define HDN_BEGINTRACK HDN_BEGINTRACKA
#define HDN_ENDTRACK HDN_ENDTRACKA
#define HDN_TRACK HDN_TRACKA
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFO HDN_GETDISPINFOA
#endif
#endif

結局、HDN_*Wが来てました。今まではHDN_*Aを待っていたので捕まえられなかった
訳です。で、僕のプログラムではUNICODEが#defineされていなかったのが原因なわけ
ですが・・・これって僕のミスなんですか?
どうも腑に落ちない。

888 名前:874 :02/03/16 02:06
んでもってBEGINDRAGとENDDRAGだけは分けられていない。UNICODEかどうか
気にするなんて文字列についてのことなんだろうけど、BEGINTRACKでもBEGINDRAGでも
アイテムの情報(文字列を含む)をパラメータとしてもってくることに変わりはない。

ますます謎だ・・・。

889 名前:デフォルトの名無しさん :02/03/16 03:23
>>883-888をみて、MFCで確認しようとしたらclass wizardが狂ってた・・・鬱
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q281155

890 名前:デフォルトの名無しさん :02/03/16 20:19
ちょと、素朴な疑問
オイラ、ウィンドウのプログラム組むときにMFC使わずにWin32だけで組んでいますが、
C++でMFC使わずに組んでる人ってどれくらいいるの?



891 名前:デフォルトの名無しさん :02/03/16 20:22
>>890
はい。ATL/WTL は使ってるけど(w

892 名前:デフォルトの名無しさん :02/03/16 20:28
前はMFC使ってたけど、どうもオイラには合わない…
それにDLLヘルの問題がやだ、
STATICリンクにしても良いけどサイズが1M超えるのはかんなり鬱
っつーことで、Win32でC++で組んでるけど
結構クラスライブラリひととおり組むと勉強になる

893 名前:デフォルトの名無しさん :02/03/16 21:07
2つ以上のクライアントウィンドウがある時
DefFrameProcの2つ目の引数のクライアントウィンドウのインスタンスは
何を指定すればいいのでしょうか?

毎回getWindowで指定するのがいいのでしょうか?

894 名前:デフォルトの名無しさん :02/03/16 21:08
あげ

895 名前:デフォルトの名無しさん :02/03/16 21:52
>>892
勉強目的にはいいと思う。でも、それだけだな。
MFC はダメなライブラリだけど、その流儀に従えば
開発時間は短縮できるもの。


896 名前:!=892 :02/03/17 01:15
>>895
ある程度大きなプログラムになると外面のコーディングは実装の
コーディング量を遥かに下回るから、どちらを使っても大差ない。
むしろ綺麗にかけるという点で自前ってのも悪くない。
勿論SDKで書くことに慣れてるのが前提。

逆に小さめのプログラムだとMFCはかなり効率を上げるが、
正直開発効率追求ならBCBやらDelphiを使えば良いわけで。

897 名前:初心者 :02/03/18 17:49
うえーんヽ(TДT)ノ
Win32API糞むずいよー( ´Д⊂ヽ)
誰か教えてよー

898 名前:デフォルトの名無しさん :02/03/18 17:59
>>897
何処で詰まってるか言え。

899 名前:初心者 :02/03/18 23:17
さ、最初からです(TT;)
例えば
int WINAPI WinMain()...

というのでWINAPIは何なのですか?
と教えて貰おうと思いましたが自分で調べないのはマズイので
ちょっとhttp://www.google.ne.jp/へ逝ってきます

900 名前:デフォルトの名無しさん :02/03/18 23:36
>>899
__stdcall のことデス。

901 名前:デフォルトの名無しさん :02/03/19 00:21
>>899
キーワードは「猫でも分かるプログラミング」で一発。

902 名前:デフォルトの名無しさん :02/03/19 00:46
>>899
あまり細かいことを気にしたらいかん。
特に型周りは typedef の嵐だから、 "そういうもの" ということで
覚えてしまったほうがある意味楽だぞ。

903 名前:デフォルトの名無しさん :02/03/19 00:47
google.ne.jpなんてあったのか…

904 名前:デフォルトの名無しさん :02/03/19 00:48
>>899
「呼び出し規約」でMSDN検索しる。

905 名前:mige :02/03/19 23:46
みげ

906 名前:zxcvbnm :02/03/20 00:24
誰か居てるの?


907 名前:zxcvbnm :02/03/20 00:30
オーナードローリストビューのデータの取り方を誰か教えて下さい
今はWinbiffのひらめーるにあるようなリストビューが対象です


908 名前:デフォルトの名無しさん :02/03/20 01:46
APIでコンボボックスを作っているのですが、
親ウィンドウのWM_SIZEでMoveWindowを使って、
コンボボックスの幅を動的に変えたいんですけどうまくいきません。
CB_SETDROPPEDWIDTHを使うのかなと思ったんですが、
これはリストの部分の幅を変更するだけですよね。
コンボボックスのサイズを変更する方法はないんでしょうか?

909 名前:VB6エスパー五 :02/03/20 03:11
切実な質問です(゚Д゚;)
UrlGetPart関数というのがshlwapi.dllにあるので
VB6で使いたいのですが
詳細
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/shlwapi/path/urlgetpart.asp

案の定VBにはない変数型使ってます
何がしたいかというと
HPのURLを
正確にプロトコル、ホスト、ポート、ファイルパス…と別に分解して得たいのです
(Winsockコントロールを使ったHTTPクライアント(ブラウザとまではいきませんが)を作成中なのです)

ぜひVB6で扱う際の手引きをください
LPDWORD や DWORD型を 以下にVBで処理するのか
VCはサボってましたので ここが難問なのです
ポインタがからむものはちょっと

他に楽な関数があったら 教えてください
VBだけでやるほうは 自分で考えてみます
お願いします



910 名前:デフォルトの名無しさん :02/03/20 07:52
>>908
普通にSetWindowPosなんかを使ってできないの?

911 名前:デフォルトの名無しさん :02/03/20 08:33
>>909
LPDWORDが pcchOut As Long
DWORDが ByVal dwPart As Long とかそんな感じ。

ってゆーか google で UrlGetPart するとVB関係の記事が最初に。。。

912 名前:デフォルトの名無しさん :02/03/21 00:31
>>911
ゴグルであった(・∀・)
http://www.mvps.org/vbnet/
ここイイね
日本人サイトはダメね
UrlGetPart関数はIE5以上についてくるようだネ
InternetCrackURL関数のほうが イイのかしら
また調べもの
日本人って ケチというか心がせまいのか
Win32APIをVBで使う宣言で著作権云々いうとこあるね
オイオイって感じ
困った人達だ

913 名前:デフォルトの名無しさん :02/03/21 04:49
あるフォルダと、別のフォルダが物理的に同じディスク上にあるかを調べられるAPIないですか?
Win2kだと、ドライブをフォルダとしてマウントできるので、リネームだけでフォルダを移動させられない
ことがあるので、調べたいのですが。

何かいい方法ないでしょうか?

914 名前:デフォルトの名無しさん :02/03/21 04:52
age

915 名前:デフォルトの名無しさん :02/03/21 07:27
>>913
リネームで移動させてみて失敗したらダメでいいんじゃない?

916 名前:デフォルトの名無しさん :02/03/21 14:23
2つ以上のクライアントウィンドウがある時
DefFrameProcの2つ目の引数のクライアントウィンドウのインスタンスは
何を指定すればいいのでしょうか?

毎回getWindowで指定するのがいいのでしょうか?

VC++使ってMDI作ってる人なんて、あまりいないと思いますが・・・・
いればよろしくお願いします

917 名前:デフォルトの名無しさん :02/03/21 15:26
>>916
猫行け、猫。

918 名前:デフォルトの名無しさん :02/03/21 19:20
Windows で、ウィンドウが表示された時に、そのことを検出し、
そのウィンドウのハンドルを取得するコードが必要になりました。
しかし、いろいろ探してみたのですが、フックをかける方法か、タイマで定期的に EnumWindow を回すか、どちらかの方法しか見つかりません。
最終的にはこれでいくしかないんでしょうけど、もっとシンプルに、
他のプロセスに迷惑を与えないような、またシステムに負荷をかけないような方法で、
ウィンドウが表示されたことを検知する方法はないものでしょうか?

(ウィンドウが生成されたら送られてくるメッセージなどがあればいいんですが・・。
ざっと探したところ、見つかりませんでした)

使用言語は Visual C++ で、MFC は使っていません。SDK でガリガリやってます。
2000/XP で動作すればいいので、9x 系にはない API やテクニックによる解決法も大歓迎です。


919 名前:デフォルトの名無しさん :02/03/21 19:24
>>918
WM_CREATE

920 名前:918 :02/03/21 19:43
>>919
お返事ありがとうです。
でも、WM_CREATE って自分(もっといえば自スレッド)がウィンドウを作成したときに
送信されるもので、他スレッド、プロセスが作成(表示でもいいですが)されたときには送られてきませんよね?


921 名前:デフォルトの名無しさん :02/03/21 20:18
フックが一番簡単だよ

922 名前:デフォルトの名無しさん :02/03/21 20:32
>>920
WH_CALLWNDPROCRET でフックかけて WM_CREATE 捕まえられないか?

923 名前:デフォルトの名無しさん :02/03/21 20:39
>>922
ふつうはWH_CBTだろ

924 名前:デフォルトの名無しさん :02/03/21 20:40
いやいやSetWinEventHookですよ

925 名前:918 :02/03/21 20:55
お返事ありがとうです。

>>921>>922
やっぱりフックですか・・。うーん。

>>924
SetWinEventHook を調べてみましたが、英語の資料しか見つかりませんでした(^^;
Google で検索して、日本語ページ4つで全部 MS のものでかつ Active Accessibility のもの・・。
他に参考となる資料はありませんか?
MSDN の英語資料を見ると、SET_OBJECT_CREATE で window object を作成したときを
キャッチできるようなのですが、それ以上は私の英語力では読みとれませんでした。


926 名前:デフォルトの名無しさん :02/03/21 21:05
>>925 SetWindowsHookExじゃないの?

927 名前:918 :02/03/21 21:23
>>926
SetWindowsHookEx とは別に、SetWinEventHook というのもあるらしいです。
Accessibility の API だそうですが・・。

あ・・・
SetWindowsHookEx で WH_CBT でよさそうな感じですね(^^; >>923
すみません、調べが足りませんでした。



928 名前:デフォルトの名無しさん :02/03/23 16:29
C++ & SDKでRichEditコントロールを使おうと思ったんだけど、
リソーススクリプトの書式がわからんのですよ。
下に書いたようにやったら、どうやらダイアログを表示せずに
即終了してしまうみたいで。どなたか教えてください。

// main.cpp
DialogBox(hThisInst, "SAMPLEDLG", NULL, (DLGPROC) DialogFunc);

// main.rc
SAMPLEDLG DIALOGEX 10, 10, 320, 240
CAPTION "sample"
STYLE WS_OVERLAPPEDWINDOW | WS_VISIBLE
{
CONTROL "", IDD_RICHEDIT, "RICHEDIT", WS_BORDER | WS_VSCROLL | ES_MULTILINE , 0, 0, 10, 10
}

929 名前:デフォルトの名無しさん :02/03/23 18:52
>>928

MFC だと AfxInitRichEdit()というのを呼ばないといけない。
だからそれに相当することをやらないといけないんだろうけど
あとは知らない。

930 名前:デフォルトの名無しさん :02/03/23 19:05
>>928
ダイアログを表示する前の適当なところで
::LoadLibrary("RICHED32.DLL");を入れてリッチエディットのクラスを登録しておかないと行けない。

931 名前:デフォルトの名無しさん :02/03/23 20:50
>>929-930
LoadLibraryしてませんでした。感謝。

932 名前:デフォルトの名無しさん :02/03/23 22:19
WM_KEYDOWNで
Ctrl+key Shift+key を検出するには、自分でShiftの状態をフラグで持っているとか、
GetASyncKeyStateなどで調べるのがふつうなのでしょうか?

933 名前:デフォルトの名無しさん :02/03/23 22:21
age

934 名前:デフォルトの名無しさん :02/03/23 22:36
>>932
素直にアクセラレータ使え

935 名前:デフォルトの名無しさん :02/03/23 22:51
>>934
フルキーカスタマイズを実現したいため、
全部のキーパターンをアクセラレータに登録するのが面倒なんで、困るんです。

936 名前:デフォルトの名無しさん :02/03/23 23:46
>>935
アクセラレータテーブルは作れるよ。MSDN調べてみるといい。

937 名前:デフォルトの名無しさん :02/03/24 00:20
>>932
どうでもいいがWM_KEYDOWNで使うならGetKeyStateの方が普通。

938 名前:デフォルトの名無しさん :02/03/24 00:37
>>936
サンクス、調べてみます。
WM_KEYDOWNだと、日本語キーボードで ';' ':'がたいてい別キーなのに、
VKコードが同じだったり使いづらいので、WM_CHARと併せて2回判定する必要が
ありそうだったので、困ってました。

939 名前:デフォルトの名無しさん :02/03/24 02:54
Windows2000の環境で多国語を表示するにはどうすればいいのでしょうか?
CreateFontW に DEFAULT_CHARSETを設定してもだめだし、
どのようなパラメータでフォントを作成すればいいのでしょうか?


940 名前:デフォルトの名無しさん :02/03/24 10:46
特に考えなくても表示できると思いますが。
フォントとか色々インストールしてますか?

941 名前:デフォルトの名無しさん :02/03/24 11:19
*.rcで作った、ダイアログに付けたメニューに、アクセラレータキーを
設定する方法を教えてください。
メニューと同じ名前のアクセラレータを作っただけでは働かず、
WM_INITDIALOGで LoadAccelerators(hInst, "samplemenu");
って感じにやっても働きませんでした。

942 名前:デフォルトの名無しさん :02/03/24 11:21
アクセラレータキーってLoadAcceleratorsでロードしただけじゃダメなのよん。
TranslateAcceleratorやらなきゃ。
問題は、これをどこでやるかだ・・・

943 名前:941 :02/03/24 15:14
うーん…色々やってみましたが、よくわからんです。

「メッセージループしてるところで捕らえる」、ってのは解ったのですが
DialogBox(...) でダイアログを作ってるので、何処がメッセージループに
なってるのかが解りません。

CreateDialog(...)に書き直すのは問題ないのですが、書き直さないで
実現できる方法は無いでしょうか?

944 名前:デフォルトの名無しさん :02/03/24 17:44
>>943
CreateDialogBoxで作って、自分でメッセージループを回す

945 名前:デフォルトの名無しさん :02/03/24 19:47
>>943
モーダルダイアログボックスは、メッセージループを自分で回してしまうので
無理。モーダレスダイアログボックスでモーダルダイアログボックスをエミュ
レートしましょう。MFC 使ってもいいけど。

946 名前:941 :02/03/24 21:01
>>944-945
わかりました。ありがとうございます。

947 名前:デフォルトの名無しさん :02/03/24 21:17
2000以降では使えて、NT4.0で使えないAPI関数がコード上にある場合、
バイナリは分けるしかないでしょうか?
同じバイナリにすると、OSによって読み込むdllファイルを動的にかえるってことを
しなければならないとおもうのですが、そんなことが果たして可能なのでしょうか?

948 名前:デフォルトの名無しさん :02/03/24 21:21
バージョン差を吸収するラッパー関数を作ればよろし。

949 名前:デフォルトの名無しさん :02/03/24 21:26
>>947
> OSによって読み込むdllファイルを動的にかえる
LoadLibrary() 使いましょう。

950 名前:947 :02/03/24 22:07
>>948
でもラッパー関数ないでそのAPIを呼んだら同じことなんでは?

>>949
なるほど。
でもよく考えたら、やっぱりNTにないAPI関数がコードにある時点でだめなような
気がしてきました・・・

951 名前:デフォルトの名無しさん :02/03/24 22:42
>>950
NTにないAPI関数をコードから取り除くためにLoadLibrary()を使うんだよ
GetVersionEx()を使って場合分けすれ

952 名前:947 :02/03/25 00:28
>>951
そうだったんですか・・・
わかりました。ちょっとMSDN逝って来ます。

953 名前:947 :02/03/25 00:55
大体わかりました。
おおざっぱなところでは、

if(version = WIN2000)
{
 HINSTANCE hLib = LoadLibrary("aaa.dll");
 if(hLib)
 {
  FARPROC fp2000API = GetProcAddress(hLib, "only2000Func");
  if(fp2000API )
  {
    (*fp2000API)();
  }
 }
}

てなところでしょうか?

実は2つほど疑問があります。

954 名前:947 :02/03/25 01:01
疑問1: LoadLibraryで指定するライブラリはどう取得するのか?
 # 今ところNTで実行するときにでてくるエラーダイアログからしかわからん(w

疑問2: 上記ロジックでやれば、ひょっとしてOSでの場合分けはいらないのでは?
 # if(fp2000API)があるからなんですが。

955 名前:デフォルトの名無しさん :02/03/25 01:09
a1-1 決めうち
a1-2 FindFirstなどで検索(一般のプラグイン実装とおなじやね)

a2 yes

956 名前:947 :02/03/25 01:31
>>955 どうもです。

>a1-1 決めうち
> a1-2 FindFirstなどで検索(一般のプラグイン実装とおなじやね)

なるほど。FindFirstFileでdllを探しにいうということですよね?
dllがなかったらあきらめると。

> a2 yes
ですよね。ありがとうございます。

957 名前:947 :02/03/25 02:02
関数ポインタの引数渡しで少し苦しんだけど、dllで決めうちで目的の物がつくれました。
ありがとうございました。

958 名前:デフォルトの名無しさん :02/03/25 02:10
>>954
同名の別仕様関数が隠しAPIなどで他のOS上に実装されて
いないことが保証されているなら場合分けの必要はないが
OSごとに処理ルーチンが異なるんだったら普通しとくもんだろ

959 名前:デフォルトの名無しさん :02/03/25 18:46
DCに文字列表示するときの実際のドットの幅を返してくれるAPIってありますか?
文字列とデバイスコンテキストを渡してやると幅を返すような奴。
MSDNのテキストのとこには見つからなかったもので。

960 名前:デフォルトの名無しさん :02/03/25 18:49
ある。

961 名前:959 :02/03/25 19:22
見つけました
GetTabbedTextExtent
でOK.ですね。
>>960
探し方が足りませんでした〜

962 名前:デフォルトの名無しさん :02/03/26 01:05
http://pc.2ch.net/test/read.cgi/tech/1017072275/
新スレ立てマスタ

963 名前:1000! :02/03/28 19:12
1000だろ、1000

964 名前:デフォルトの名無しさん :02/03/28 22:06
SendMessage(hWnd, WM_PAINT, 0, 0);

UpdateWindow(hWnd);
より優れている点はありますか?
SendMessageでWM_PAINTを送るメリットを何一つ感じません。

965 名前:デフォルトの名無しさん :02/03/28 22:25
>>964
なんでそんなことすんの?

966 名前:デフォルトの名無しさん :02/03/28 22:30
>965
そんなことって何?

967 名前:デフォルトの名無しさん :02/03/29 01:06
>964
wParamとlParamが0じゃイカンだろ(違
自分で勝手にWM_PAINTを送りつけても、クリッピング領域とか管理してないから
まともに再描画はされないぞ。メリットとか言う以前に仕様違反。

968 名前:デフォルトの名無しさん :02/03/29 02:04
WM_PAINT

A window receives this message through its WindowProc function.

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_PAINT
WPARAM wParam, // not used
LPARAM lParam // not used
);
Parameters
wParam
This parameter is not used.
lParam
This parameter is not used.


だけど、確かwParamはたしかHDCを指してたような

969 名前:WM_PAINT :02/03/29 18:04
The WM_PAINT message is generated by the system and 『should not be
sent by an application』. To force a window to draw into a specific
device context, use the WM_PRINT or WM_PRINTCLIENT message.

>だけど、確かwParamはたしかHDCを指してたような

For some common controls, the default WM_PAINT message processing
checks the wParam parameter. If wParam is non-NULL, the control
assumes that the value is an HDC and paints using that device context.

970 名前:デフォルトの名無しさん :02/04/17 23:24
質問です。
ダブルクリックの時間はどうやって取得しますか?
二回目のクリックで、WM_LBUTTONDBLCLKが送られなくなるまでの時間。
ダブルクリック動作を手動で実装しなければいけなくなったので。

971 名前:デフォルトの名無しさん :02/04/17 23:27
標準コントロールは、SendMessageでWM_PAINTが送られると、画面じゃなくWPARAMに描画してくれます。
標準じゃないクラスの窓は、作者の実装次第。
WPARAMがゼロじゃない時はBeginPaint〜EndPaintを呼ばずにWPARAMを使う癖をつけてもいいかも。

972 名前:デフォルトの名無しさん :02/04/18 00:16
>>970
http://msdn.microsoft.com/library/en-us/winui/mousinpt_1qn9.asp

973 名前:970 :02/04/18 00:25
サンクスです。うわ、そのまんまな名前ですね

974 名前:デフォルトの名無しさん :02/04/18 06:33
質問です。
最近のソフトによくあるアイコン付きのメニュー(Officeとかみたいの)
はAPIではどうやって作るんでしょう?

975 名前:デフォルトの名無しさん :02/04/18 06:48
API Onlyといういみなら、オーナードローでゴリゴリ書け、としか。

976 名前:デフォルトの名無しさん :02/04/18 07:34
ライブラリのソースを読めばいい。

977 名前:デフォルトの名無しさん :02/05/09 22:19
ちょっと、教えてくれ!
「Shift + Home」をAPIで押した状態にしたい。
その場合、どうすれば良いか?

ただし、keybd_event等はKey_Down等のイベントが起きるので
使いたくない!!

できれば、SendMessage(PostMessage)等が理想。

978 名前:デフォルトの名無しさん :02/05/09 23:14
次スレへどうぞ。

979 名前:デフォルトの名無しさん :02/05/17 00:11
u 

980 名前:デフォルトの名無しさん :02/05/17 00:11
u  

981 名前:デフォルトの名無しさん :02/05/17 00:11
u   

982 名前:デフォルトの名無しさん :02/05/17 00:11
u    

983 名前:デフォルトの名無しさん :02/05/17 00:11
u      

984 名前:デフォルトの名無しさん :02/05/17 00:11
u       

985 名前:デフォルトの名無しさん :02/05/17 00:12
u        

986 名前:デフォルトの名無しさん :02/05/17 00:12
u          


■過去ログ置き場に戻る■ 1- 前250 最新50
DAT2HTML 0.33f Converted.