2010年04月07日

SetStretchBltMode

自作ビューアの縮小画像だが、SetStretchBltMode で HALFTONE に設定し、StretchBlt したらかなり改善した。今では静止画像なら StretchBlt の方が画質が良くなるのか。ビデオカードとデバイスドライバにもかなり変わるらしいけど。これを使っていなかったのは Win95/98 に対応していなかったせいだろう。
その後、前から気になっていた異常終了する原因を探して、それらしい所を幾つか修正した。これでしばらく使ってみる。
posted by 七癖 at 18:28| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2010年04月05日

いまさらDirectDraw

画像の表示には自作のビューアを使っていて、画像の位置移動、拡大縮小、同じフォルダ内の画像の切り替えがテンキーを中心に簡単に操作できるようにしてあって気に入っている。不満があったら改造すればいいし。
それで、画像表示には DrawDibDraw 関数を使っているのだが、縮小表示に不満があって、対して Vista 付属の WindowsPhotoGallery の画質がいいので、なんとかしたいと思い始めた。
そこで、DirectDraw を使ってみることにした。つまり DirectX7。今インストールされているのは DirectX11 で、Microsoft は次を伺おうとしているのに、なんといまさら。もっとも、このプログラムは Win95 で開発し始めたので、ちょうどいいといえばちょうどいい。
とはいえ、公式サイトからは資料がすっかり消えてる。昔ダウンロードした覚えもあるのだが見つからない。仕方ないので、適当に検索して落としたもので試す。Setup.exe は使わずに、検索資料を参照して、必要なヘッダと.libを抜き出す。
当初、白黒で何でだと思ったら、CreateDIBitmap の HDC がメモリDC だったせいだった。
画像表示まで成功。縮小してみた具合は、DrawDibDraw と変わらず。多分、まったく。
実際に運用するにはバージョンチェックとか必要だけど、作ったコードは整理して没フォルダ行き。
posted by 七癖 at 17:48| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2010年02月26日

24bit と 32bit の色数の違い

画像処理で、wxWidgets に足りないところを吉里吉里2のコードから取ってこようとしたら、吉里吉里2は1ピクセルの色をARGBの32ビット4バイトで表しているのに対し、wxImage ではRGBの24ビット3バイトで表しており、α値は別の配列として持っていることに気づいた。
まあ参考にしているのだけれど、理解すればするほど吉里吉里2は本当に32bit環境で最適化しているのだなあと感心する。
posted by 七癖 at 16:38| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2010年02月20日

wxGraphicsContext を使えるようにする。

wxWidgets には、wxGraphicsContext というそれぞれのOSが持っているより高度な描画方法が用意されている。Windows なら GDI+ だ。
だが、標準ではビルドされない。

include\wx\msw\setup.h
内で、
#define wxUSE_GRAPHICS_CONTEXT 0
となっているのを、
#define wxUSE_GRAPHICS_CONTEXT 1
に修正してビルドする。

それから、wxMSW では、プログラムで使うとき、gdiplus.lib を組み込まなければならない。設定で追加してもいいが、ソースに書くなら

#ifdef __WXMSW__
 #ifdef wxUSE_GRAPHICS_CONTEXT
  #pragma comment(lib, "gdiplus.lib")
 #endif
#endif

そして、wx/graphics.h をインクルードする。
posted by 七癖 at 18:01| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2010年01月19日

wxTextFile と wxTextOutputStream

wxWidgets には、ファイルを開く形式、バイナリかテキストかを選択できないようだ。改行記号だけの問題なのだけど。
そこで、テキスト形式での保存に、最初に見つけた wxTextFile を使ってみたのだか、まずこれは Create と Open を厳密に区別する。ファイルがないと Open できず、既にあると Create できない。Open でファイルが無いときに空のファイルを作ったりしないのだ。そして、ファイルを開くと同時に内容を一旦全部読みだす。これで行単位での移動を容易にしているみたいだ。
なので、この wxTextFile は、インタプリタコードの読み取りや、ログの追記には便利そうだが、全く新しいものを上書きするには不向きに思えた。
かわりに見つけたのが wxTextOutputStream。wxFileOutputStream でファイルを開いてから結びつけて使う。改行は endl を放り込めば、プラットフォームに合ったものに直してくれる。指定、変更も出きるけど。
この置換に時間を食った。
posted by 七癖 at 22:08| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年08月20日

wxFileHistory

「最近使ったファイル」のファイルパスの管理には wxFileHistory を使う。
コンストラクタで、記憶する数と、メニューで使う(最初の) ID を指定できる。
wxFileHistory::Save と wxFileHistory::Load で設定ファイルへの保存と呼び出しができる。
ファイルを開いた時、wxFileHistory::AddFileToHistory で記憶させられる。
メニューで押された ID からファイルパスを取得するには
GetHistoryFile(event.GetId() - wxID_FILE1));
というふうにする。
メニューへの表示は wxFileHistory::UseMenu と wxFileHistory::AddFilesToMenu があるのだが、使い方がよくわからない。MFC のように「終了」の上に置きたかったのだが、新たに増える場合、いちばん下に追加されて困っている。
posted by 七癖 at 16:14| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年08月19日

画像ファイルを読み取れるようにする

wxWidgwts で、PNG や JPEG ファイルを wxBitmap で読み取って表示するためには、
wxImage::AddHandler( new wxPNGHandler );
wxImage::AddHandler( new wxJPEGHandler );
をあらかじめ呼んでおく。wxApp::OnInit() が適当か?
::wxInitAllImageHandlers だと、まとめて準備できる。
posted by 七癖 at 16:29| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年08月09日

wxScrollBar とか wxKeyEvent とか

wxWidgets の wxScrollBar の範囲設定が、長さのみで、MFC の CScrollBar のように最小値と最大値の範囲設定でない。今は問題ないけど、後で困ることが起こるかも。

キーボードメッセージを処理する wxKeyEvent では、押しつづけてリピートされた回数を直接取得できない。32bit Windows なら wxKeyEvent::GetRawKeyFlags() の下2バイトから取れるけど、他の OS では無いのかも。
posted by 七癖 at 16:25| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年07月30日

分割ウィンドウの境界バーをどうしようか

分割ウィンドウを使いたかったんだけど、wxSplitterWindow が縦か横の二分割しかできないみたいで役に立ちそうにないので、自力で作ることに。
まあタイムラインの方は自力で作ってたんだけどね。

そもそも、MFC6 では分割ウィンドウはソースで書かれていて、Aero で見ると VC6 開発環境の分割バーはそこだけクラシックになっていて、浮いている。VCE2008 はまだまし。

それで、wxWidgets になにかないかと探したら、wxRendererNative ってのがあった。これは、使う wxRenderer を static のように wxRendererNative::Get で取得して使うみたい。スキンを実装する場合は、wxRendererNative を継承したクラスの実体を wxRendererNative::Set するようだ。なんとなく。スキンを使う予定はないけど。

ただ、分割ウィンドウは、DrawSplitterSash のようにウィンドウ枠を書くようなので、ちょっと直さにゃならん。

とりあえずは、ツリーの開閉ボタンを、今までいちいち四角を書いてプラスやマイナスを線で書いていたのを、DrawTreeItemButton で書けばいいのは楽そうだ。

まだ実行して見れる段階じゃないので、間違ってるかも。
posted by 七癖 at 16:35| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年07月27日

wxDC

相変わらず、コピペしては直してる。

MFC の CDC と wxWidgets の wxDC の違いが結構多くて難航してる。
これまで何気なく使ってきた CDC のメンバ関数が、実は MFC のソースで書かれていて、wxDC にはないのでいちいち作ってる。
CDC::SelectObject がペン(wxDC::SetPen)やブラシ(wxDC::SetBrush)などそれぞれに分かれているし、これまでは使い終わったらちゃんと戻していたんだけど、サンプルを見ると戻さなくてもよさそうなので、楽なのだが不安だ。

他、生の Windows API をそのまま使っている箇所がけっこう見つかる。発見したら直しているけど、一度全部見直さないとダメだな。
posted by 七癖 at 16:10| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年07月25日

wxRect

タイムラインのビューを作ろうと、前に MFC で作ったコードをコピペし始めたのだが、MFC から wxWidgets への変換が大変だ。
特に四角形。
MFC の CRect が left, top, right, bottom なのに対し、
wxWidgets の wxRect が x, y, width, height なのだ。
left→top、top→y は一斉置換で済ませたものの、右端座標と下端座標から幅と高さへの変換は、いちいち考えながらせにゃならん。
ビューはなにもかも四角形だらけで、多すぎる。よくもまあ汎用性のないコードをこんなに書いたものだ。
なんかラッパークラスを作った方が楽だったかもしれん。でもいちいち直してる。

そうしているうちに、何か変だぞと調べてみたら、MFC の CWnd::GetClientRect は wxWidgets では wxWindow::GetClientSize だった。四角形からサイズへの変更ときたものだ。

未だ終わりは見えず。
posted by 七癖 at 16:02| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年07月17日

wxWidgets と MFC の違い たぶんその1

MFC から wxWidgets に乗り換えて、細かい箇所で戸惑ったことを書いておく。

1.MFC の CSize の縦横は cx、cy だが、wxSize はただの x、y。

2.MFC の CString::Format では、書式化された結果が、実行された実体(変数)に収められるが、wxString::Format は static になっていて、書式化された結果は返値になり、実体から実行しても実体に何の変化もない。
posted by 七癖 at 16:16| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年07月01日

wxAui と MDI

上や横にドッキングしたり浮かせたりするツールバーやツリービューをwxWidgetsで再現するには、wxAui を使えばいいことがわかった。
気になったのはMDIで使えるのかどうか。wxMDIParentFrame が持つwxMDIClientWindow を wxAuiManager に AddPane すればよいのかと思ったところ、最初に実行する wxAuiManager::SetManagedWindow で実行されてた。MDI でも普通に使えるようだ。多分。テストはだいぶ後になりそう。
後はサンプルを参考にすればよいのだろうが、大量に追加されているのがどこに行っているのか、何をしているのか、謎だ。
posted by 七癖 at 19:01| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年06月27日

wxFont

wxWidgets のフォントクラスは wxFont である。
これまで使ってきた Windows の構造体 LOGFONT に比べて、初期指定できるパラメータが少ないので、楽だ。
大きさはポイント単位で指定し、取得する。デバイス単位で取得するにはいちいちデバイスコンテキストを呼び出して変換しなきゃならないみたいで面倒だ。こういうときは最初に一度スクリーンのデバイスコンテキストを取得して係数を保存しておくという手をよく使うのだが、途中で解像度を変えられたらそのメッセージから変更する関数を用意せにゃならんし、プリンタで印刷する時は別に作らないかん。印刷機能を実装する予定は無いけど。
今検索したら計算式が違ってた。とほほ。
posted by 七癖 at 16:36| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年06月23日

TAK 再び

Ubuntu で TAK(Tom's verlustfreier Audiokompressor.) 形式が再生できなかったので、ちょっと調べてみたら、前にやったときのファイルが見つかった。このブログにも書いてあったし。それも半年前。記憶力が減退してる。
中をみたら何をしていたか思い出した。前はcueシートが別にあるタイプだったけど、今度は組み込まれているタイプ(バイナリを直接見るとフッタのようだ)だったので、sdk を見ながらやってみた。
tak_SSD_Create_FromFile でファイルを開き、
tak_SSD_Valid で確認し、(ファイルが見つからないとここでエラー)
tTak_SSD_GetAPEv2Tag で APEv2 情報にアクセスできるようにし、
tak_APE_Valid で確認し、
tTak_APE_GetItemNum でアイテムの個数を得、順番に
tTak_APE_GetItemDesc で必要なメモリ量を、
tTak_APE_GetItemKey でアイテムのキー名を
tTak_APE_GetTextItemValueAsAnsi でアイテムの内容を取得する。
ってな具合だ。
結果、Cuesheet はテキストそのままの形で入っているのね。文字列解析が必要だとちょっと面倒だ。公式から落とせる Tak.exe だと分割してデコードできないんだよなあ。
なので、読み出した Cuesheet はそのままテキストファイルとして書き出し、Tak.exe で、変換した本体とともによくある cue+wav として使うことにした。(cueのFILE文で指定するファイルの拡張子を変更する必要あり)
その過程で、前に「変換後のwaveヘッダがいつもと違うみたいだ。」と思っていたのが間違っている事を知る。ついでに本家で公開している奴に欠陥が見つかった。恥ずかしい。
posted by 七癖 at 19:30| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年06月19日

wxColour

コンピュータで扱う色は、リソースが少なく性能が低い時代が長く続いたものだから、なかなか面倒な事になってる。今でも、安い液晶ディスプレイは擬似フルカラーらしいけど。
まあ、最近のなら RGB 255*255*255 で指定しておいてもなんとかなるだろうと、VC6では一つの色にCOLORREFを使っていた。これは32ビットDWORD、unsigned long なのでちょうどいいのだった。
wxWidgets では 色に wxColour クラスを使う。デバイスコンテキストの描画関係の関数で使う引数も色はこれになってる。ただ、DWORD の数値で初期化できるのに、今の色を DWORD で取得する方法が見つからなかった。いや、実は今見つかった(wxColour::GetPixel)。なんか今日の打ち込みが徒労になったと感じる。
wxColour は wxObject の子クラスで、これまでの DWORD に比べてサイズが大きくなってしまう。SAE ではユーザーが画面上の色を自由に変更できるよう、それぞれを変数にしてあるので、ちょっと悩んだ。結局、描画の度にいちいち wxColour を作るよりはいいかと、wxColour で持ってることにしよう。wxColour だと、文字列や#で始まる6桁の16進変数で色を指定したり取得できるので、設定ファイルをメモ帳で開いて編集するのがわかりやすくなるだろう。変更ダイアログを作れといわれそうだけど。
posted by 七癖 at 19:22| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年06月05日

wxStandardPaths

wxWidgetsで実行しているプログラム自身のファイルのパスを入手する方法を探していたら、wxStandardPathsというクラスが見つかった。
これのGetExecutablePath()メンバ関数から取得できる。
こんな感じ。

wxStandardPathsBase& stdp = wxStandardPaths::Get();
wxString exepath = stdp.GetExecutablePath();

それから、
wxFileName::GetPath は名前と拡張子を除くパス、実質親ディレクトリ
wxFileName::GetFullPath は名前と拡張子を含むフルパス
と言うのが分かりにくい。
posted by 七癖 at 18:52| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年06月03日

wxConfig

VC6のMFCのウィザードで作ってまずやることは、設定の保管場所をレジストリからプログラムと同じフォルダに置いた.iniファイルだったりした。
wxWidgetsでも、最低限のウィンドウを開くところまで作った後で、これに手をつけた。
windowsのレジストリの利点は、windows本体や他アプリケーションとの連携だと思っている。OLEのサーバ、コンテナってやつだ。SAEでも、画像ファイルを編集できるよう、画像編集アプリをSAE内で埋め込んで使えるようにすると便利なのかもしれないが、windows以外がわからないし、MFCと違ってウィザードからやり直す必要が無いので、当面は捨てておく。
さらには、設定で保存する項目が多いので、設定をファイルに保存する機能を作っておくことにする。
調べると、wxConfigクラスがそれに当たるようだ。ファイルへの保存には、wxFileConfigを使う。
http://www.h3.dion.ne.jp/~k5_n/wxwin/memo/ver0_2.html
に、日本語の詳しい説明とサンプルがあって助かった。ただ、日時が少し古いのが少々難点だ。
ここの説明だと、パスの区切り文字の部分を自前で容易しているので、何か無いかと探したら、wxFileNameってのがあった。
また、wxGetCwdで得られるパスは作業ディレクトリなので、VCEのデバッグ時に.exeのあるDebugフォルダではなく、その上のソースファイルが置いてあるフォルダになってしまい、いちいち消すのが面倒だ。ただ、設定ファイルの置き場所は、インストーラとアンインストーラを用意できるのならば、ユーザー別のフォルダの指定の設定ファイル置き場にしたほうがいいかもしれない。
他にも相変わらずわからない所が多い。
posted by 七癖 at 18:56| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年05月23日

サイザー

wxWidgetsでダイアログやフォームにコントロールを配置するときは、wxSizerの派生クラスを使うと便利だ。フォームの大きさを変えても自動的に整理して配置し直してくれる。
コントロールの追加の仕方はウィンドウみたいだが、これ自体はウィンドウでは無くレイアウトを決定するだけだ。
wxGridSizerやwxFlexGridSizerなんてのもあるけど、wxBoxSizerを入れ子状に使っていくだけで十分かも。
ただ、フラグがいまいち分からず、なかなか思うようになってくれない。英語は嫌いだー。
posted by 七癖 at 16:36| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2009年05月07日

wxCode

wxWidgetsで使えるコード集を探したら、wxCodeというのがあった。
日本語の解説は、
http://www14.ocn.ne.jp/~bkclass/doc_wxcode.html
くらいしか見つからない。

とりあえず圧縮してまとめてあるのをいくつかダウンロードしてみたが、プロジェクト(ソリューション?)形式の変換の途中でエラーがでるし、いまいち使い方がわからん。少し時間をかければ何とかなりそうな気もするが。

業務用アプリで使えそうなスプレッドシートやグラフがあるけど、自分の意図とは微妙に違うので、必要な場所だけ参考にして使っていこうかな。
posted by 七癖 at 17:31| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。