2008年07月20日

【C++系】Combobox、意外とめんどい

3連休、ひたすらコードと格闘する
なんかフリーの受け入れ先が減ってるみたいなので、ちっとでも「私は使える人間ですよ」というのを示せるものを書いておかないと、下手すると「正社員になる」とかいう現状では不本意な選択をしないといけなくなりそうなので。

安定した職種から逃げて不安定な職種を望むといのも、いとおかし。そして不安定の方がハードル高いのも、またおかし。

個人的に、不安定な立場の方がぬくぬくしなくて済むから生きやすかったりします。今も「再来月の仕事どうしよう」って、キリキリしてる。それが心地よい。

はい、後ろに崖がないと戦えないダメ人間です。別の言い方をすると、ドM?


昨日はウィンドウメッセージフックして云々をやっていました。で、今日はComboboxで、Editのところに入力できて、且つ、▼押すとリストが開くヤツを実装しようとする。

あっさり作れると思っていたのに、意外と面倒。

Editの部分に入力できるタイプだと、CBS_DROPDOWNを指定する。
ただ、これだと▼押してもリストが開かない。何のためにボタン出しとんねん、と一言ツッコミを入れてみる。ディスプレイに向けて。


で、選択肢としては、自前でCB_SHOWDROPDOWNする処理を書くか、CBS_DROPDOWNLISTを使用して、EditBoxの部分をサブクラス化して自前で書くか。IEのアドレスバーは後者で実装してるし、そっちが正しいのだろうけど、面倒だったので前者で実装してしまう。


▼が押された判定は、コンボボックス上でLBUTTONDOWNされた際に、CONBOBOXINFOを取ってきて、rcButtonのRECT内に入っているかを確認するという、やや(かなり?)強引な処理をしてみる

CONBOBOXINFOでボタンのHWNDも取れればいいのに。というか、コンボボックスのボタンのウィンドウハンドルって、どうやって取るのだろう。軽く調べたけど、見つからなかったのであっさり諦めた。


//追記。COMBOBOXINFOの取り方。
COMBOBOXINFO info;
SendMessage ( CB_GETCOMBOBOXINFO, 0, (LPARAM)&info );
//これだと動かない

//こう書く
COMBOBOXINFO info = { sizeof( COMBOBOXINFO ) };
SendMessage ( CB_GETCOMBOBOXINFO, 0, (LPARAM)&info );
posted by MW at 23:41| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

【C++系】Alt+GでGoogleツールバーにフォーカスが行く感じ

キーボードで動かせるツールバーなら、キーボードでフォーカス得られないといけないよなぁと思い、GoogleがAlt+Gでやってるような機能を実装する。

どうやってやってんだろうと調べてみたところ、SetWindowsHookEx で WH_KEYBOARD をフックして(対象はIEのスレッド)、フォーカス移動してるっぽい(想像)。

メニューのアクセラレータ的なものがツールバーにも用意されてるのかと思って無駄に何時間も探してしまった。これでもし在ったら泣こう。


staticなCALLBACK関数から、開いてるIEのインスタンス取らないといけないので、インスタンスをスレッドIDをキーにしてstaticなstd:mapに保有させておいて取り出すとかしてみる。

うーん、この処理で良いのだろうか。わからん。


【やったこと】
・map作る
static std::map<DWORD, CKbieBarBand*> bandMap;

・SetSiteで、フック
m_hHook = SetWindowsHookEx ( WH_KEYBOARD, KeyProc, NULL, GetCurrentThreadId() );

・SetSiteで、インスタンス登録しておく
bandMap[GetCurrentThreadId()] = this;

・フックしたプロシージャの関数
static LRESULT CALLBACK KeyProc (int nCode, WPARAM wParam, LPARAM lParam );
//ここで、こんな風にしてインスタンス取る
クラス名* pBand = bandMap[GetCurrentThreadId()];
//で、このインスタンスに用意したフォーカス取る関数呼ぶ幹事

・後は適当にデストラクタで開放


動いてはいる。二窓でも三窓でも動いてはいる。でも、この書き方でホントにええのかなぁという疑問もふと浮かぶ。
posted by MW at 16:48| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

2008年07月16日

【C++系】.txtに関連付けられたexe起動

今日も役に立たないソースを書いた


知り合いに、IEのツールバーにcalcと打つと電卓が立ち上がるようにしたと言ったら、notepadと打ったら.txtに関連付けられたexe起動するようにして欲しいと言われる

なるほど。現状の「notepad → メモ帳開く」よりは数段役立ちそう
ただ、notepadコマンドはnotepadでいて欲しいので(気分的に)、コマンドのエイリアスをユーザが設定できるようにして(既にあるコマンドの上書きも可能)、勝手にやってねという方向を考える
(エイリアス機能はまだ付けてないけど)


で、.txtに関連付けられたアプリの取ろうとしてみる
試行錯誤の末、うちのサクラエディタは開くようになった。けど、これで大丈夫なのかとてもぁゃcぃソースになる


手順はこんな感じ

1. レジストリの下記キーから、Applicationという値を取得する
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt
(そこにsakura.exeとか入っている)

2. レジストリの下記キーから、デフォルト値を取得する
HKEY_CLASSES_ROOT\Applications\{1で取った値}\shell\open\command
(そこに"sakuraのパス" "%1" とか入ってる)

3. 2で取った値の、1個目のダブルコート内を抽出してShellExecute


ということをする
3の処理がなんか違う気がするけど、ちゃんとする気力がない・・・・
週末、がんばろう・・・・
posted by MW at 01:17| Comment(2) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

2008年07月15日

【C++系】ShellExcecuteでプログラムの追加と削除

先ほどの件、ついでにこんなコマンドを実装してみる

・freecell
・winmine

どんな効果があるかは・・・・まぁ、文字の通りで・・・・


相変わらずいらんものばかり付けてるのもあれなので、こんなコマンドも付ける

・appwiz (別名:pgrem)

アプリケーションの追加と削除が立ち上がる。別名はprogram removeをしたい人が使うやつなので、なんとなく割り振ってみた。

ShellExecuteでプログラムの追加と削除を立ち上げる記述は、こんな感じ

ShellExecute( NULL, L"open", L"control.exe", L"appwiz.cpl", NULL, SW_SHOW );
posted by MW at 01:25| Comment(1) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

【C++系】ShellExcecute系で追伸

コマンドプロンプトで「logoff」と打つと、ログオフできるということを始めて知った

試しに実装してみた

ツールバー上で、logoffと打つ

何の断りもなく、いきなりログオフスタート!


あー、こんな危険な機能、いらねっすw
Confirm入れたとしても十分に危険なので、封印
posted by MW at 00:33| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

【C++系】ShellExcecuteでインターネットオプション

さて、今日も役に立たない情報を載せてみよう

今日はツールバー上でcalcと打つと電卓が開くという、

ぶっちゃけ、どうでもいい

機能を追加してました

仕事から帰ると23時過ぎてるしー
平日はこの程度の機能しか付けられないー

calcを開く場合はごく普通のコード、
ShellExecute ( NULL, L"open", L"calc.exe", NULL, NULL, SW_SHOW );
これで開ける


で、これだけだとただの阿呆な機能なので、コマンドからインターネットオプションを開いてみようと思う
が、同じようにShellExecute の open で呼んでも開けず、20分くらい止まる


Q. どうすれば開けますか?
A. Google先生に聞いてください


というわけで、こうやって書くそうです
ShellExecute(NULL, L"open", L"control.exe", L"inetcpl.cpl", NULL, SW_SHOW);
posted by MW at 00:17| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

2008年07月14日

【C++系】IEのFullScreen

誰にも役立たない情報

IEをフルスクリーンモードにしようと思って、IWebBrowser2のput_FullScreenを使ってみる

すると、何か違う。IEのF11でフルスクリーンにした場合は、上の方に戻す用のボタンっぽいのが出るけど、put_FullScreenだと単純に現在の画面がフルスクリーンになって、F11押しても戻らない。むしろ閉じないと戻らない


IWebBrowser2の他の機能を見てたら、put_TheaterModeというのが見つかったので、これを呼んで見たら、F11と同じ状況になった。F11キーを押すと、ちゃんと戻る


へー
posted by MW at 00:55| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

2008年07月13日

【C++系】クリップボードに貼り付け

例のヤツに、クリップボードにホームページのタイトルとかURLを貼り付ける機能を付ける

・表示ページのタイトルをクリップボードに貼り付け
cb -t
cb title

・表示ページのURLをクリップボードに貼り付け
cb -u
cb url

んー、titleとかurlとか打たせるなら省略にだけハイフン付けるのも変か


ところで、クリップボードにワイドキャラのまま貼り付けたら、1文字目しかコピーできんかったのですが、そういうもんなんでしたっけ。イカン、クリップボードの仕様、全然知らん。

書いたソースは、こんな感じ。ワイドキャラでやった時は、sizeを2倍にして、そのままwstr.c_str()を渡した感じで書いて、イカンかった

==================================================
//貼り付ける文字をマルチバイト文字に変換
CW2A cw2a( wstr.c_str() );

//クリップボードを開く
if( !::OpenClipboard ( NULL ) )
  return;

//クリップボードへ文字列をコピー
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, wstr.size() + 1 );
LPSTR lpstr = (LPSTR)GlobalLock(hMem);
lstrcpyA ( lpstr, cw2a.m_psz );
GlobalUnlock(hMem);

//クリップボードに設定
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();
==================================================

boost 1.35
VisualC++2008
posted by MW at 23:53| Comment(2) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

【C++系】boostのtokenizer

なんかその辺に落ちてる boost::tokenizer のソースを使ってみたら、うまくコンパイルが通らなかったので、適当にソース見て動くようなものを書く

WStringとかいるのは、勝手にstd::basic_string<wchar_t>をアレしてるだけです
どうもネーミングがJavaっぽくなる。ていうか、C++ってどうやっても名前がうまく収まりつかない。せめて名前文化だけは、言語と世界の壁を乗り越えて欲しいものです

とりあえず関数の頭文字を大文字にするか、小文字にするか、そこから。たぶん小文字が主流だから、MSさん、合わせて

========================================
typedef boost::char_separator<wchar_t> Separator;
typedef boost::tokenizer<Separator, WString::const_iterator, WString> Tokenizer;

WString test(L"abc def gh ijk lm");
Separator sep(L" ");
Tokenizer tok(test, sep);

for (Tokenizer::iterator it = tok.begin(); it != tok.end(); it++ )
{
  WString str = *it;
}
========================================

boost 1.35
VisualC++2008、つまり9
posted by MW at 14:34| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

【C++系】boostの正規表現

なんか忘れそうなので、今日書いたコードをここに置いておく

boostの正規表現は、regexかxpressiveを使う
xpressiveはboostをビルドしないでも使える

普通に使うととかテンプレート指定しないといけないけど、なんか中でtypedefとかいろいろ気楽に使わせてくれるものが用意されてた

typedef basic_regex<std::wstring::const_iterator>
こんな感じのとかが

========================================
#include <:boost/xpressive/xpressive.hpp>
using namespace boost::xpressive;

wsregex re = wsregex::compile ( L"https?://.*" );
wsmatch mt;

if ( regex_match ( sUrl, mt, re ) )
{
  //TRUE
}
========================================

URLを判定するロジックです
もう少しまともな正規表現、書かないと・・・・
posted by MW at 01:45| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

広告


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

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

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


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。