2013年8月28日水曜日

#include "qedit.h"におけるエラーの解決方法

#include <qedit.h>におけるエラー
fatal error C1083: include ファイルを開けません。'qedit.h': No such file or directory
の解決方法

#include <qedit.h>の直前に

#pragma include_alias( "dxtrans.h", "qedit.h" )
#define __IDxtCompositor_INTERFACE_DEFINED__
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
#define __IDxtJpeg_INTERFACE_DEFINED__
#define __IDxtKey_INTERFACE_DEFINED__

を追加する。すなわち、

#pragma include_alias( "dxtrans.h", "qedit.h" )
#define __IDxtCompositor_INTERFACE_DEFINED__
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
#define __IDxtJpeg_INTERFACE_DEFINED__
#define __IDxtKey_INTERFACE_DEFINED__
#include <qedit.h>

とする。
また、
VisualStudio2012のメニューバーから
デバッグ(D)→***のプロパティ...
→構成プロパティ→全般→全般→プラットフォームツールセット
より、
Visual Studio 2012 (v110)」から「Visual Studio 2012 - Windows XP (v110_xp)」に変更する。
さらに、
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
に「qedit.h」を(古いSDKもしくはインターネットから拾ってきて)追加する。(追記を参照)

具体的には、このへんにこっそり、置いておく。
MD5 | d01aacaa70adbcc476812451e09cd1be | 215.8 KB | qedit.h
http://ux.getuploader.com/ADMIS/download/57/qedit.h

注意:この場合の「qedit.h」は無編集状態のもの。
(エラー回避のために、「qedit.h」を直接編集する方法もあるのですが、
そうした処理(コメントアウト)をしていないもの)

「Visual Studio 2012 (v110)」から「Visual Studio 2012 - Windows XP (v110_xp)」としているのは、単に私が「Visual Studio 2012 (v110)」のインクルードフォルダが何処にあるのか知らないためです。

追記:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include
に「qedit.h」を(古いSDKもしくはインターネットから拾ってきて)追加すれば、「Visual Studio 2012 (v110)」のままでOK



このブログのDirect Show 関連トップ
http://the-united-front.blogspot.jp/2013/09/blog-post_20.html

2013年8月7日水曜日

Windows API リサイズ&移動が可能な
枠なしウィンドウを作成する。(その①)

その②
その③

取りあえずここでは枠なしウィンドウを作成してみます。
リサイズは「その②」「その③」で扱います。

枠なしウィンドウ、若しくはタイトルバーの無いウィンドウを作ろうと思います。
まずスケルトンプログラムを
http://www.wgag.net/winapi/0012.html
から拝借して、骨格を完成させます。
次に模範となるプログラムを探します。
http://d.hatena.ne.jp/satosystems/20100108/1262947730
がいいですね。透過処理などを施していますが参考になりました。
最後にちゃんと調べます。少し違いますが、
http://ameblo.jp/kazukiokumura/entry-10483325989.html
が参考になりますね。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
ここのスケルトンプルグラム、一部間違っており、
34行目は「hInst, NULL);」ではなく「hPrevInstance, NULL);」です。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
一番下のリンクより、
どうやら WS_VISIBLE でウィンドウを可視状態に、 WS_POPUP でタイトルバーとウィンドウの境界を非表示にするようです。
様は、上記のスケルトンプログラムの
HWND hWnd = CreateWindow(
                szWndClass, _T("Title"),
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT,
                CW_USEDEFAULT, CW_USEDEFAULT,
                NULL, NULL,
                hInst, NULL);
の部分を
HWND hWnd = CreateWindow(
                szWndClass, _T("Title"),
                WS_POPUP | WS_VISIBLE,//←ココ!!!!
                0, 0,
                0, 0,
                NULL, NULL,
                hPrevInstance, NULL);

注:
WS_POPUP:は、ウィンドウが枠やタイトルバーを持たないクライアント領域だけで構成されるホップアップウィンドウである事を意味します。
WS_VISIBLE:はウィンドウが作成された時点で可視化する事を意味します。これを設定しない場合「ShowWindow(hWnd, nCmdShow);」を実行するまでウィンドウは可視化されません。
(今回は取りあえず意味も無く両方とも入れています。)

とすれば良いのだろうと思ったのですが、実行してみるとウィンドウが消えてしまいます。
(マウスでドラックしてラインが出るかどうかを見れば分かるのですが、)
見えていないのではなく、存在していないようです。
そこで、二番目のリンクのサンプルと比較してみると、この処理の後に
MoveWindow(hWnd, 100, 100, 200, 200, TRUE);
と実行されている事が分かりました。
(一ドット(あるいは0ドット)しか表示されていない)ウィンドウの表示を広げていると考えると納得できます。
そこで以下のように変更しました。
HWND hWnd = CreateWindow(
                szWndClass, _T("Title"),
                WS_POPUP | WS_VISIBLE,
                0, 0,
                0, 0,
                NULL, NULL,
                hPrevInstance, NULL);

 MoveWindow(hWnd, 100, 100, 200, 200, TRUE);
CW_USEDEFAULTの部分を全て0にしていますが、動作上は結局サイズが上書きされる事になるので関係ありません。(ただ、関係ないなら書かない方がコードが綺麗だと思う……。)
これで見事表示されるのですが、残念ながら私のデスクトップは背景が真っ白なので確認が困難です。
そこで、
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);

    wc.hbrBackground = (HBRUSH)BLACK_BRUSH;
と変更します。



ブログに掲載する関係でtabを半角スペース8個に置き換えています。
tabのままがいい方は以下のリンクからダウンロードしてください。
ダウンロード



全体としてのコードは以下のようになりました。

以下の灰色の四角が今回作ったウィンドウです。

ウインドウを常に最背面(デスクトップに貼り付ける)方法 c++

ガジェットのようにデスクトップに貼りつくプログラムを作ろうと、色々なサイトを回り
随分と悩んだけど、結局以下の一行で解決した。

//ウィンドウをProgram Managerと言う別プロセスの子ウィンドウとして指定して、Winmdows+Dキーでもデスクトップの上に残るようにする。なお、Aero機能が有効の場合はWorkerWプロセスに乗せないといけないらしい。
//気に食わないやり方だが、取りあえず目的を達成できるので良しとする。//だがこの方法、ガジェットと違って、Winmdows+Dキーを押したときのチラつきは無い。


SetParent(hWnd,FindWindow(NULL, _T("Program Manager")));//Program Manager のハンドルを取得し、親ウィンドウに設定する


Aeroが有効の場合は
SetParent(hWnd,FindWindow(NULL, _T("WorkerW")));//WorkerW のハンドルを取得し、親ウィンドウに設定する

今日まで知らなかったのだが、Visual StudioのツールにあるSky++と言うソフトでこれらの関係を見ることができる。いつか無理やり子ウィンドウとして解決するのではなく、ガジェットのようにちゃんとした解決法を見つけたい……。



以下に参考になったサイトのリンクを貼っておく。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1483405764
http://dotlog.info/archives/1702
http://www.orangemaker.sakura.ne.jp/labo/memo/sdk-mfc/win7Desktop.html

2013年8月4日日曜日

全角表示時のDrawText及びTextOutの文字化け

全角文字を使うときはCreateFontの第9引数にSHIFTJIS_CHARSETを指定しないといけないようです。

HFONT CreateFont(
int nHeight, // フォントの高さ
int nWidth, // 平均文字幅
int nEscapement, // 文字送り方向の角度
int nOrientation, // ベースラインの角度
int fnWeight, // フォントの太さ
DWORD fdwItalic, // 斜体にするかどうか
DWORD fdwUnderline, // 下線を付けるかどうか
DWORD fdwStrikeOut, // 取り消し線を付けるかどうか
DWORD fdwCharSet, // 文字セットの識別子←ここにSHIFTJIS_CHARSETを指定
DWORD fdwOutputPrecision, // 出力精度
DWORD fdwClipPrecision, // クリッピング精度
DWORD fdwQuality, // 出力品質
DWORD fdwPitchAndFamily, // ピッチとファミリ
LPCTSTR lpszFace // フォント名
);
(http://msdn.microsoft.com/ja-jp/library/cc428368.aspx より)