2010年6月19日土曜日

ListViewのヘッダ幅を固定してみる(C++/CLI & win32)

なんかやっぱり流行りというかAndroid関連での検索が引っかかってくる今日この頃。
そんな中 windowsformアプリ関連(C++/CLI)のことをちょこっと。しかも今更な内容。
正直Windowsアプリはwin32APIでゴリゴリに書く人で、.Netってな~に?って状態ですので、間違ってても責任取りません。
ってかむしろこういう方法あるよ!、みたいな素敵な指摘が欲しいです。

内容としては ListView header幅固定 を C++/CLIにwin32APIを混ぜて実現したもの
ちなみにヘッダの境界線にマウスが来た際にマウスカーソルが変更されるのも阻止。
まとめると

  • ListViewのヘッダ幅がマウスで弄れないこと
  • ヘッダの境界線上でマウスカーソルが変わらないこと
なお、会社で確認した動作確認はXP SP3
開発はVS2008 standerd sp1
家での確認は 7 pro のVC++ 2008 Express Edition

スゲー簡単な方法
// stdafx.hに追加
#include "windows.h"
#include "commctrl.h"

// Form1.hの適当なところに追加
// 略
EnableWindow( ListView_GetHeader( reinterpret_cast(this->listView1->Handle.ToInt32()) ), FALSE);
// 略

ぶっちゃけ、 Google先生に「ListView ヘッダ固定」で聞いてTOPに返ってくる内容ですが…。
上記内容をフォームのコンストラクタの中にでも突っ込んでおけばOK。
その辺から拾ってきたのを足しただけですので、ありなのかどうかすら分かりませんが、一応目的は果たせます。

上記の注意点

windows form アプリ的にはあまりwin32APIを使用されたくなさそうです。
環境にもよりますが、多分上記はまずリンカエラーとなるでしょう。
これもググれば答えが返ってきますが、一応方法を。

vs2008 standerd sp1 の場合は、うろ覚えですが、
・プロジェクト → プロパティ → C/C++ → 全般 → 追加のインクルードなんたら → 親からなんたら にチェック
で通るようになるかと。
何でも2005位からformアプリ作成時の初期設定では、win32用のライブラリが軒並み外されているとかで、自分で設定が必要らしいです。
もちろん個別に必要なライブラリをリンクしてもいいんですけど。

VC++ 2008 Express Edition
上記と同じ方法で行けると思いきや、駄目でした。
そこで取った方法は次の方法。

  • Win32コンソールアプリを作成
  • プロジェクト → プロパティ → リンカ → コマンドライン からlibファイル名をコピー
  • Formアプリの同じ場所にコピーした内容を貼付け
超強引ですがこれで行けますwww

ちなみにコピーした内容はこれ

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

不要なものも居るけどその辺は無視。

ちょっと面倒な方法

お作法的にいいのかどうかは全く分かりませんが、上記にたどり着いて気がついたのは
「余裕でwin32APIガンガン使えるじゃん!」ってことです。

ウィンドウハンドル取得できれば結構やりたい放題ですよね。
さて、上記のようにHeaderを無効化することで目的を果たすと、楽は楽なのですがこんな要望が来たらアウト。
・ヘッダ部分のクリックはしたい!
更に、私が確認した環境では上記方法ではヘッダ部分をクリックすると、何故か一行目のアイテムがクリックされたと認識することも発覚。
というわけで、ListViewもヘッダ部分もサブクラス化してしまへ。

//****************
// Form1.hとか
//****************

HWND hList = reinterpret_cast(this->listView1->Handle.ToInt32());
HWND hHeader = ListView_GetHeader( hList);

OrgList = (WNDPROC)GetWindowLongPtr( hList, GWLP_WNDPROC);
SetWindowLongPtr( hList, GWLP_WNDPROC, (LONG_PTR)ListViewSubWindowProc);

OrgListHeader = (WNDPROC)GetWindowLongPtr( hHeader, GWLP_WNDPROC);
SetWindowLongPtr( hHeader, GWLP_WNDPROC, (LONG_PTR)ListViewHeaderSubWindowProc);


//****************
// hoge.cpp/h 色々略
//****************

WNDPROC OrgList, OrgListHeader;


LRESULT CALLBACK    ListViewHeaderSubWindowProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
 switch(msg){
 case WM_SETCURSOR:
  return TRUE;
 }
 return (CallWindowProc(OrgListHeader, hWnd, msg, wp, lp));
}

LRESULT CALLBACK    ListViewSubWindowProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
 NMHEADER* pnmhdr;
 switch(msg){
 case WM_NOTIFY:
  pnmhdr = (NMHEADER*)lp;

  switch(pnmhdr->hdr.code){
  case HDN_ENDTRACK:
  case HDN_BEGINTRACK:
  case HDN_TRACK:
  case HDN_DIVIDERDBLCLICKW:
   return TRUE;
  }
  break;
 }
 return (CallWindowProc(OrgList, hWnd, msg, wp, lp));
}

上記のソースもその辺探せば幾らでも出てきます。

  • Header部分でカーソルを変更させない
  • カラム幅をいじらせない
それぞれを自前で実装したというか、本来の実装へ渡さないだけですが。

ちなみにヘッダをクリックできるとか出来ないとかは、ListView::HeaderStyleで変更出来ますので、 まあ、わざわざwin32APIを使用するまででもないでしょう。

なお、恐らくこの段階ではまたもエラーになると思います。
コンパイル時に「 /clr:pure または /clr:safe と共にコンパイルされた関数に対する呼び出し規約 '__stdcall ' が無効です」というエラーがでると思います。
その指摘に従って
・プロジェクト → プロパティ → 共通言語ランタイム サポート
を /clr:pure から /clr へ変更することで、コンパイルが通るようになります。

また、Vistaから「HDS_NOSIZING」なるスタイルが追加されたようなのですが、 もしかするとこれらの実装(サブクラス化)をしなくても、このスタイル設定一発で終わる可能性も大ですね。
ま、めんどくて確認していませんし、そもそも私の場合XPで動作することが前提ですから。
誰か結果を教えてください。

ってか、こんな実装ありなんだろうか…
ぶっちゃけ何処がC++/CLIなんだか、普通にwin32じゃん…
C++/CLI 使いの方教えてください。
むしろ一番目に書くべきな気もしますが、貼り付けたコンソールのウィンドウハンドルって結構簡単に取れるよ!ってことが言いたいだけです。

2010年5月22日土曜日

今更ながらDesireを見てきた

最近全く家でプログラム書いてない…
まあ、その分会社で書いているので問題ないですがwww

さて、今日何となく電気屋に行ってフラっと立ち寄ったら
HTC Desire が置いてあり、触れました^^

先日OS2.2もGoogleIOで発表されたので、何処と無く今更感がありますが…


正直な感想

Desire >>>>>>>> Xperia >= HT-03A

です。

XperiaもHT-03Aも(会社名義ですが)保有しています。
もちろんXperiaのハードスペックには全く不満はありません。
CPUだってXperiaとDesireは同じスナップドラゴン。

だけど体感が全然違う、比べるのも失礼なくらい違う。

HT-03Aは既にちょっと前の携帯なので、比較に入れるのはどうかと思いますが、
まあ、メインで使っているので…

個人的に一番使っている(使い慣れている)というのもあり、
Xperia >= HT-03A としました。
正直、普段使うようなアプリでの動作感の差は、XperiaとHT-03Aでそんなに違うとは思えません。

そこを踏まえると、やはりOSのバージョンの差が大きい気がします。
XperiaもわざわざあそこまでOSをカスタマイズするメリットがあるのか気になります。
docomoというキャリアが問題なのか、ソニエリが問題なのか。
PCを買う時だって、(ハードスペックは十分なのに)OSを選択するのに今更98やXPを選ばず、7選ぶでしょ?
iPhone買う時だって今更3G買わずに3GS買うでしょ?(アップル商品買った事ないけど)
1.6を選ぶ理由は無いと思うんですけどねぇ…
なんだか時代遅れですよね。
��もちろんセキュリティ的な問題や、キャリアの基準等あるんでしょうが。)

iPhoneは使ったこと無いので、想像で勝手に比較するとこんな感じでは?

Desire > iPhone 3GS >>>>>>>> Xperia >= HT-03A

Android 2.2 は更に速度向上とのことですので、今後が更に気になります。
HTC EVO 出ないかな~

来月には次世代iPhoneの発表があるはずですし、スマホ市場の行方は気になりますね。



え?IS-01?
なにそのキャベツロイド。

2010年4月18日日曜日

GWはどこへ行こう

あと半月でGWです。
今年もロングツーリングへ行くか、それとも隔週ならぬ隔日とかでサーキットとか…。

って考えていたら仕事に手がつきません。
┐(´∀`)┌ヤレヤレ

当然先月から暖かくなっているので、家でプログラミングなんてこともやってません。
いや、時間があればあんなことやこんなことをテストしたいんですけどね。

それこそ自前センサーロガーを作ってツーリングログ取得とか。

噂によるとGWも凄く寒くなる可能性があるとか無いとか。
もしそうならば、GWはヒキコモリプログラマーかな?

でもやっぱりツーリングが一番。

去年九州に行って見てこれなかった箇所に行くのもいいなぁ。
或いは近場を2泊3日くらいでフラフラもいいなぁ。

というかもうずっと休みならいいなぁ。

無理か…。

2010年3月22日月曜日

都内開花らしい

先週に引き続きトミンモーターランドへ行ってきました。

午後だけ。



2台ほどBコースを28~9秒ぐらいで走る恐ろしい方々がいました。

スタッフの方の話によると最速クラスの人たちは26~7秒らしいですが。

オソロシイ。



そんな私の本日ベストは32.8

32秒切れるようになったら、そろそろ車体を弄ってもいいか?

まあ、お金があればですけど。

キャブくらいは社外品にしたいものですが・・・。



むしろXR100M売って、頑張ってNSF?

う~ん、危険な妄想だ・・・。



とか考えていた帰りの渋滞で、都内でソメイヨシノが開花したことをラジオを聞いて知りました。

もうそんな季節か・・・。


2010年3月20日土曜日

無線機を買ってみた

STANDARDのVX-6を買いました。





今年はバイクと車に無線機を載せたいと思います。

まあ、思うだけなら2年くらい前から思っていましたが。



同じようなやつで

VX-7



とか

VX-8




とかありましたが、まあデュアルで受信する必要も無いし・・・。

お高いし・・・



あ、ちなみに上記の奴らは全てアマ4無線の免許が必要です。

受信Onlyなら問題ないのかな?

もちろん無線開局も必要です。



ここからはそんな無線開局に関する総務省に対しての愚痴ww



アマチュア無線の開局手続きはweb申請できるんですね。

http://www.denpa.soumu.go.jp/public2/list/index.html#self



なんですが、新規登録のフォームにいくら文字を入力しても化ける・・・。

もうなんでかしらんが文字化けする。


結果として

・IEを使用する

・インターネットオプション→詳細タブ→Internet Explorerの設定をリセット

してからじゃないとダメと言うことが判明。



どんなサイトの作りしてるんだか・・・。

まあ、いまどきIEなんて使っていないので、いくら設定をリセットしても個人的には関係ないんですがね。

もうちょっと全うにサイトを作って欲しいものです。

色々とわかりづらいし。



さて、一週間後にIDとpassが届いたら申請の続きができるわけですが、

この調子だと更なるどうでもいい苦労が待っていそうです。