問題タブ [wtl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Visual Studio 2008 c ++条件付きテンプレート継承のバグ?
現在、C ++ / WTLプロジェクトをVisualStudio2005からVS2008に移植しています。プロジェクト構成の1つは、プリプロセッサシンボルUNIT_TESTを定義する単体テストビルドです。
WTLクラスをテストハーネスに取り込むために、CFakeWindow
すべてのCWindowメソッドをスタブするクラスを作成しました。次に、stdafx.hファイルで、atlwin.h(CWindowクラスを定義する)のインポートのすぐ下でこれを行います。
私のウィンドウクラスは次のようになります。
これはVS2005でうまく機能します。問題は、VS 2008では、CFakeWindowクラスではなく、元のCWindowクラスのメソッドが呼び出されることです。CWindow
もちろん、これにより、が散らばっているため、テストが失敗しATLASSERT(::IsWindow(m_hWnd))
ます。
デバッガーでコードをステップ実行すると、CAboutDialogクラスがから継承していることがわかりCDialogImpl<CAboutDialog, CFakeWindow>
ます。しかし、CAboutDialog
(たとえばEndDialog(code)
)でメソッドを呼び出すと、CWindow
メソッドが呼び出されます。
これはVS2008のバグですか、それとも私の条件付きテンプレート継承手法はVS 2005で許可されていたが、VS 2008では「修正」された忌まわしいものでしたか?回避策はありますか、それともWTLクラスを単体テストするために別の手法を検討する必要がありますか?この手法は、WTLライブラリをいじくり回すことなく、WTLクラスをテストハーネスに組み込むことができるため、非常に気に入っています。
編集:以下のConalへの応答に記載されているように、プリプロセッサの出力は、私のクラスがCFakeWindowから継承していることを示しています。
そして、上記のように、デバッガーでコードをステップ実行すると、CAboutDialogがCFakeWindowから継承したものとしてローカルウィンドウに表示されます。
編集2:Conalのアドバイスに従って、逆アセンブルを実行しました。コードはおそらくCFakeWindowメソッドを呼び出していますが、実際にはCWindowメソッドが呼び出されています。
私はVC++2008デバッガーのバグにもっと傾倒し始めています。
user-interface - 所有者が描いたコンボボックスが空で表示されるのはなぜですか?
WTL コンボボックスをサブクラス化し、コンボボックスのアイテムをオーナー描画しています。コントロールには属性がCBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWVARIABLE
あり、ミックスイン クラス COwnerDraw を使用して DrawItem() と MeasureItem() を実装しています。ドロップダウン リストがダウンしている場合、アイテムは正しく描画されます。ただし、ドロップダウン リストが表示されている場合、コンボ ボックス コントロールは空であり、アイテムは描画されません。私は何を間違っていますか?
WTL クラスは次のようになります。
このクラスはダイアログで使用され、次のようにサブクラス化されます。
コントロール属性を にCBS_OWNERDRAWFIXED
変更しても何も変わりません。
編集: najmeddine の助けのおかげで、ドロップダウン リストの項目だけでなく、実際のコンボ ボックスを描画するには WM_PAINT を処理する必要があることがわかりました。残念ながら、コンボボックス コントロールもすべて自分で描画する必要があります。コントロールの「内側」のみを描画する必要があるように、GDI に境界線を描画させて矢印をドロップさせる方法はありますか?
visual-c++ - Windows 7 リボンを WTL アプリに追加する方法
WTL アプリでネイティブの Windows 7 リボン コントロールを使用しようとした人はいますか?
私は背後にあるコントロールを意味します:
またはMFCの例。(MFC Feature Pack のリボンについては触れません!)
--- スヴェン
message-queue - WTLを使用してカスタムメッセージを正しく処理する
社内サービスのストレステストを行うために、マルチスレッドのWTLutilを作成しました。
通信スレッドは、終了したことをメインスレッドに通知するため、メインスレッドは対応するオブジェクトを削除できます。
彼らはそのように信号を出します:
私の問題は、私が定義したカスタムメッセージをどのように処理するかです。
メッセージマップのエントリを使用してハンドラーを呼び出したいと思いました。例:
ただし、OnThreadQuitが呼び出されることはありません。
私がそれを処理できる唯一の方法は、PreTranslateMessageでハンドラーを明示的に呼び出すことです。
これは正しい方法ではないと確信しています...
私は正しい方法を知りたいです-誰かが助けることができます!?
c++ - デフォルトのWM_DESTROYは、子ウィンドウを適切にクリーンアップしません
WindowsMobile5用のWTL8.0SDIアプリケーションがあります。以下のこの不自然な例では、ビューを作成し、破棄してから、再作成します。ただし、再作成されると、コントロールのHWNDが無効であるため、WM_INITDIALOGハンドラーでアサーションが失敗します。
CMyViewでWM_DESTROYを処理し、すべての子コントロールを手動で破棄することで、これを修正できることに注意してください。しかし、私はそうしなければならないとは思いませんでした。MSDNは言う:
このメッセージは、最初に破棄されているウィンドウに送信され、次に破棄された子ウィンドウ(存在する場合)に送信されます。
誰かが何が起こっているのかについての考えを持っていますか?
編集: CMyViewでWM_NCDESTROYを処理する場合、すべての子コントロールハンドルは引き続き有効です!(some_control_.IsWindow()==TRUE
)それはそれが想定されている方法ではありません...
ありがとう、PaulH
c++ - ComboBoxEx32(CComboBoxEx)キーボードの動作
このスタイルで拡張コンボボックスコントロール(Win32クラスComboBoxEx32
)を使用するWTLアプリケーションがありますCBS_DROPDOWNLIST
。それはうまく機能しますが(ボックス内の各アイテムに対して画像を表示できます)、キーボードの動作は通常のコンボボックスとは異なります。キーを押しても、その文字で始まるコンボの最初のアイテムにジャンプしません。
たとえば、文字列「Arnold」、「Bob」、「Charlie」をコンボに追加した場合、コンボを選択して「B」を押すと、「Bob」は選択されません。
誰かがこれを機能させる方法を知っていますか?現在、私が考えることができる唯一のアイデアは、「実際の」コンボボックス(CBEM_GETCOMBOCONTROL
メッセージを使用してこれへのハンドルを取得できます)とプロセスを何らかの方法でサブクラス化することWM_CHARTOITEM
です。これはPITAなので、他の誰かがこの問題に遭遇したことがあるかどうか尋ねたいと思いました。
c++ - ベースカラーを指定して、グラデーション塗りつぶしの開始色と終了色を計算する
WTL C ++アプリケーションがあり、ユーザーがいくつかのUI要素に異なる色を選択し、GradientFill
API呼び出しを使用してグラデーション塗りつぶしを適用できるようにしたいと考えています。ただし、ユーザーにグラデーションの開始色と終了色を選択させるのではなく、「ベース」色を選択して、アプリケーションで適切な開始/終了色を自動的に計算できるようにしたいと思います。最終的に、Windowsがさまざまなテーマの要素に使用するものと同様の塗りつぶしを作成したいと思います。基本色は、グラデーションの「中間」色である可能性があります。私のアプリケーションでは、グラデーションの開始時にわずかに明るい色を計算し、グラデーションの終了にわずかに暗い色を計算します。または、ベースを開始色として使用して終了を計算することも、その逆も可能です。
RGBマクロの魔法を使えば、これは比較的簡単だと思いますが、どこから始めればよいのか本当にわかりません。どんなアイデアでも大歓迎です。
visual-studio - VS2010にWTL8.0プロジェクトウィザードをインストールするにはどうすればよいですか?
WTL 8.0パッケージをダウンロードしましたが、AppWizardsをインストールするためのスクリプトがVS2010をサポートしていないことがわかりました。
VS 2010でのインストールをサポートする更新スクリプトを知っている人はいますか?
ありがとうございました!
winapi - ATLアプリのCMainDlgのWM_POWERBROADCASTハンドラーが呼び出されない
WM_POWERBROADCASTを処理したいATLアプリがあります。MSG_MAPでハンドラーを定義したCMainDlg(CAxDialogImpl)があります。
ただし、電源設定を変更したり、マシンをスリープ状態にしたりするなど、ハンドラーを呼び出す必要がある処理を実行しても、ハンドラーは呼び出されません。
何が起こっているのか、そしてこれを修正する方法について何かアイデアはありますか?何らかの理由で、CMainDlgは電源イベントの通知を受け取りませんか?
c++ - WinAPI (ATL/WTL) のみを使用して、WPF で Expander コントロールのようなものを作成するにはどうすればよいですか?
私は英語の初心者です。申し訳ありません:) WinAPI (ATL/WTL) のみを使用して、WPF で Expander コントロールのようなものを作成するにはどうすればよいですか? 体験は可能ですか?答えてくれてありがとう!