--- Title: win32 c++ everything Author: yamasyuh68 Web: https://mimemo.io/m/q9ON1lXgKZoLrAD --- # ToDo 右クリックメニューはリソースで作るべきか?? 複数ファイルの切り取りを実装 # 機能追加 21/8/10 - 切り取りをショートカットで実装 - エスケープで閉じるようにできた ずっとうまくいかなかったがアクセラレータをチェックして何とか解決した、バグだった 21/6/27 - 右クリックメニューに検索文字列に「破壊」を追加して再検索、を追加 # バグ修正 2021/2/7 検索文字列長を長くした というか、保存の時のバッファを長くした。ここで落ちてるっぽかったので。良く調べないでとにかく長くしただけ。いずれきちんと対応する必要ありますな # ファイルのカット - うまくいく時といかないときがあってずっと放置してたが調べて対応しましたよ - DROPFILES構造体の最後にファイル名を書いて末尾をNULLにする仕様だが、NULLが2つ、ワイドキャラで4つ必要なのを2つにしてたのが理由(だと思いたい) - とりあえずうまく動いてる模様です - わざわざクリップデータを取得するソフトを作ってそれで調べてわかった 本家のeverythingと自家製を比較して違いを発見できた 疲れたわ~( ゚Д゚) # バグ修正 20/9/22 - コンボボックスをスクロールできるようにした - クリップ文字列が長すぎる場合に回避するようにした - 検索文字列保存する際の区切り文字を[|]から[:]に変更 さすがに|はorだから使うわ # 機能追加 20/9/21 - 連休なので**検索履歴の実装**にチャレンジ - まず検索窓をエディットからコンボへ サブクラス化して使っててちょっと変更が面倒だったがまあまあできた - それより検索データの保存がむつかしい 多分ワイドキャラだからなおさら難しいんだと思う 項目を改行区切りで保存するのはあきらめて区切り文字を使うことにして何とか動くようになった 20/9/5 - ダブルクリックでエディットボックスですべて選択を実装 **この動作ってデフォルトじゃなかったんだなあ・・** 20/8/30 - アクセラレータがうまくいかない理由はなんとなくわかったのでやめた アクティブになってるコントロールにメッセージが行ってしまってそこで消費されて親に届いていないようだ。コントロールから親に送ればいいんだがいろいろ面倒なのでやめて元に戻した **ちょっと悔しい( ´∀`)** - エディットボックスにすべて選択(c+A)を実装 - アイコンつけた 20/8/25 - ESCで終了にしたくてショートカットのアクセラレータを設定したがうまくいかんなあ??? 20/7/26 久しぶり - 起動時にクリップのデータを検索する # 機能追加 20/6/7 久しぶりにいろいろいじった - 選択文字列を検索、同整形して検索 - ファイルのサイズ確認、クリップ取得 - pngのコメント取得  - escで終了~結構難しかった # 雑文 ・64BItアプリにしていて文字列は基本的にwcharでやってますがどうも面倒ですね。データを生で扱うならcharの方がわかりやすい。文字列長もwcslen()は二倍にしてます ・これは単一ファイルをカットするコードです。複数ならファイル名の間に0を一つ入れます。wideなので0を二つ入れます。最後のファイルの終端は0を二つ置くのがルールです。wideだから4つになりますが。 ・hGblの方はDROPFILES構造体のサイズとファイル名長と最後のゼロ分だけ領域を確保してます。ゼロでクリアしてあるのでゼロは書き込んでません。ちなみにDROPFILES構造体の長さは20になります。 ・ここら辺のデータのセットを正しくやらないとうまくいかない。クリップボードへのデータセットではエラーにならないけど、貼り付けるときに動作しません。私はVisualStudioのデバッガで実際にメモリを見ながら何度か試しました。 ・切り取りの際はPreferredDropEffectのデータを2でセットするのがポイントです。クリップボードのデータ形式として標準で用意されていませんのでRegisterしてコードをもらってからセットします。 ・ここら辺はc#だと、①DataObjectを作る②これにファイル名をセット③さらにPreferredDropEffectをセット④オブジェクトをClipboard.SetDataObjectする、と言う流れになるみたい。同じ事をcでやれないはずが無いのでいろいろ調べてやっと出来ました。 ・ちなみにPreferredDropEffectでセットする2というデータはlittleらしく、2000です。0002とすると失敗します。 ・トライしてから成功するまで1週間くらいかかりました ┐('д')┌ メモリをグリグリ直接いじる感じがcっぽくて良いよね。 # ファイルのカット 窓プログラミング http://hp.vector.co.jp/authors/VA016117/index.html 超初心者の Windows Program(C++) http://maeda.g2.xrea.com/winc/winc.htm Shell Clipboard Formats https://docs.microsoft.com/en-us/windows/win32/shell/clipboard DROPEFFECT_MOVE をみる これで検索 clipboard dropeffect # マルチバイト、シングルバイト strlen:シングルベース _mbstrlen: マルチベース - 文字列の両方の長さの差が文字列に含まれるマルチバイト文字数になる # c++からc#を使う http://www.wisdomsoft.jp/375.html How does files get copy/cut/paste using clipboard operations (ctrl-c /ctrl-v) https://stackoverflow.com/questions/5016874/how-does-files-get-copy-cut-paste-using-clipboard-operations-ctrl-c-ctrl-v Thread: Copy or cut files to clipboard http://forums.codeguru.com/showthread.php?66928-Copy-or-cut-files-to-clipboard ========================================= クリップボード:OLE クリップボード機構の使用 https://docs.microsoft.com/ja-jp/cpp/mfc/clipboard-using-the-ole-clipboard-mechanism?view=vs-2019 ----- ~20/5/6 TCDに送る修正 everyのメモリ開放 everyの項目編集~いろいろ everyのエラー表示 大きなファイルをパス ------- 20/4/29 - gdi++にファイルを直接渡すと排他制御になってしまう メモリ上に読み込んでから使う仕様にした、zipの時と同じね - コメントルーチン実装 バイトオーダーが違ってた。変換のためのマクロを仕入れた 基本はQtのコードを流用 - ほぼQt並みになった、使える でも大変だった~( ゚Д゚) win32apiはc、c++では書きづらい Qtと同じだな でもQtほど便利ではない┐(´∀`)┌ 20/4/27 - エクスプローラで開いてファイルを選択、実装 shellでは出来ずCreateProcessを使った - コメント表示ルーチン実装中 画像表示後再度ファイルを開いてコメントを読むか? zipも同様、先頭ファイルまでシークすれば共通のコードでいけるな (zipは画像表示のためにファイルをメモリにロードするのでその時に一緒に読もうと思っていたが、非zipは画像表示後にもう一度画像にアクセスしてコメントをロードするからzipも同じで良いな) 20/4/26 - zipの先頭画像表示実装 メモリ上の画像も表示できるようになったので、高速のビューアもこれで出来るな - コンボボックスでフィルター切替実装 - ダブルクリックでシェルに渡す実装 - かなり進んできた、残る大きな機能はコメント表示だ あとメモリの解放、これ結構難しそうだ 20/4/23 - スケーリングをスタティック枠に合わせるように書換 - 引数を受けつけるようにした GetCommandLineだと全て来るので空白でsplitする必要 ここからはまって上手くいかなくなった win32を使うって事はc++でなくcで書いた方が良いのかもしれない std::stringとwchar_t でごちゃごちゃしてきて進まなくなった win32は独自の型が多くて難しい(-_-) 20/4/22 - 表示できた(・∀・)ノ スタティックにBitmap属性設定必要だった スケーリングもできた、描画用にGraphicsが必要だった gdi++ は結構使えるが日本語だとc#のマニュアルしか無い c++だと文法が違ってあんまり参考にならないので英語だけ Qtのマニュアルに比べてわかりづらい 20/4/21 - リストで選択した画像を表示したいんだけどうまくいかない c++のファイル分割とか、まだよくわからん事も理由 Qtだと簡単にかけたんだがどこが違うのか - sttaicを配置してそこにHBITMAPをセットしてみたが表示されない 難しい(-_-) 20/4/20 - gdi+を使ってjpgを描画した、ネットのコード通りだが簡単だった WM_PAINT での描画を前提としてるのでstaticを配置してセットするのとどっちが良いか要検討 まあ両方出来るようにした方が良いよな - GUIを利用するために.net を落としてみたがやはり出来ない c#でスケルトンを試したら使えた、起動はQtよりは速いがwin32よりはやはり遅い このフォームアプリは.net環境でc#専用らしく、c++でも使えたはずだが使わせてないようだ ~ 20/4/19 リストビューにeverythingのデータを表示するまで リストの操作は簡単で良い、Qtよりも簡単かも x64にしたためだと思うが全てWcharにしなければならず面倒だった ------- オブジェクト廃止 http://kaitei.net/winapi/pens-brushes/ GDI++ 使い方 http://atelier-xwe.blogspot.com/2012/11/gdi.html jpgファイルを拡大縮小表示(32/64bit) http://yamatyuu.net/computer/program/vc2013/jpgviewm4/index.html ------- メモリ上に読み込まれたjpgファイルのイメージをGDI+でウィンドウに表示する標準的なソース(32/64bit) http://yamatyuu.net/computer/program/vc2013/jpgviewmem/index.html -------- .net があれば良いのか?? http://y-okamoto-psy1949.la.coocan.jp/VCpp/OnVSCpp2019/ --- ウインドウ位置の保存読込 https://www.ruche-home.net/program/tips/window-place ---- 第336章 GDI+の基礎 その2 http://www.kumei.ne.jp/c_lang/sdk4/sdk_336.htm #include Gdiplus.lib