スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ツールバー(CToolBarとかCToolBarCtrl)のツールチップ、ツールヒントを動的に変えたい時の覚書@VC6++

【仮定】
MFCでCFrameWndを使ったウィンドウにCToolBarがあって・・・
CToolBarにID_BUTTON_XというIDを持ったボタンがあって・・・
settingという条件によって、ID_BUTTON_Xのボタンに出てくるツールチップを動的に変えたい。

【方法】
ClassWizardでWM_NOTIFYを処理する関数OnNotifyを追加して、以下のようにTTN_GETDISPINFOを処理する。

BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
 NMHDR* pNMHDR=(NMHDR*)lParam;
 switch(pNMHDR->code)
 {
 case TTN_GETDISPINFO

スパム対策・・・

monmonさんModel_Carさんに指摘を受けました。コメントに「書き込み制限」が掛かると・・・
某大陸方面からの書き込みを全面禁止にしたつもりだったのが某プロバイダ全面禁止になってしまってた・・かも。
kyosho_ferrari_iv_f40_competizione_red_080907.jpg

どうでしょう?

w3Analyzerというのを使ってみることにした

このブログはFC2AnalyzerとGoogleAnalyticsでアクセス解析をしている。FC2ブログで書きながらこう言うのもなんだけど、FC2Analyzerは最初に数秒小さな画像が点滅して正直印象としてあんまりよくないので本当はGoogleAnalytics一本に絞りたい。

だけどGoogleAnalyticsで出来ないことがあって、FC2Analyzerははずせない。出来ないことは個別のアクセスしてくるホストのトレースみたいなところ(できるのかな?)。GoogleAnalyticsはマクロな傾向を探るのを主眼にしている&個別情報はカットするみたいなポリシーがあるのだろう。

・・レポート書いたりするのにはGoogleAnalyticsは便利なんだけどさ。

某ベンチャーさんのWebサイトにもそんな理由からFC2AnalyzerとGoogleAnalyticsを入れている。レンタルサーバーなので一応生ログは見れるが、余計な情報(ウェブクローラーの情報とか)も多いし、どうも生ログの解析ツールにいいのが無い(フリーでね)。かと言って、ベンチャーとはいえ企業なので、FC2Analyzerみたいにいかにもアクセス解析してますよ、みたいなのは好ましくない。

ということでいいの無いかと思って調査。

レンタルサーバーは各種サーバーサイドスクリプトは動くが、データベースは使えない。ってことでデータベース無しでスクリプトで動くアクセス解析ソフトをいくつか試して・・w3Analyzerというのを使ってみることにした。

という特に結論の無い覚書・・続く。
highspeed_alfaromeo_156gta_rear_080826.jpg

話と関係なくサークルKサンクス京商アルファ2記念にAlfaromeo 156GTA by HighSpeed!?。

Google Page Creator で Google Analytics が使えるようになってた


「google page creator analytics」とかでぐぐると、私が過去に書いたこのエントリーがトップに出る。

なにかというと、お手軽ホームページ作成ツールのGoogle Page CreatorにGoogle Analyticsを入れても<script>タグが消されちゃって、トラッキングできないから、<iframe>なんかの中に別に準備したトラッキングページ入れたら、一応アクセスカウントくらいできるよ、というお話。

なんだけど、普通にGoogle Page Creatorにトラッキングコード入れても動くようになったようだ。というか俺が勘違いしてたの?以前?

filter:alpha(opacity=**)とCSSに書いてもIE6とIE7で効かない!の巻

トミカリミテッドのカウンタックLP500S 半透明度10%
某ベンチャーのWEBサイト、これまでは割とべたっとしたXHTML1.0で書くだとか、W3C勧告に準拠するぞーとかばっかしてたんだけど、ちょっとだけデザインに工夫を持たせようと半透明、アルファブレンドみたいなのを使ってみようと思った。

そんな機能があるのかどうか知らなかったが、あるだろうと思って調べたらあった。例えば、あるdiv要素に50%の半透明にしたければ以下みたいに書く。

.hogehoge{filter:alpha(opacity=50); -moz-opacity:0.50; opacity:0.50;・・・}
(横に書いちゃいました・・)

filter:alphaはIE6とかIE7向け、真ん中の-moz-opacityはFireFoxとかのMozilla系向け、最後のははなんだろう?まぁこんな感じにしたら良いらしい。まぁ言ってみりゃこれ、ブラウザに依存するあんあまりよくない属性設定なんだな。

・・で試す。いきなりIE7ではダメ。

ちなみにFireFoxだと・・いけるなぁ。Operaは・・なんと、いけるじゃないかって感じでいろいろと試すが、IEだとどうやってもだめ。

調べてみる・・filter:alphaはposition:absoluteな奴じゃないとアカンとか書いてあるけど、absoluteなんだよなぁ・・と小一時間悩む。

・・結論。

今回はまず、ローカルPC上のファイルに変更をして、ローカルPC上で見え方をいろいろ試してた。編集していたWEBページ内にはいくつかスクリプトを書いてあるんだが、そうするとIE7さんはページの上の方で「スクリプト実行していいんかい」とか「ActiveXコントロール実行してええんかい」みたいな事を聞いてくる。別にローカルでは実行する必要がないのでそのままほってた。

・・なんと原因はそれでした。

どうもfilter:alphaはActiveXの実行を許可しないと、効かないらしい。他にもいろいろfilter:alphaを効かせるための条件があるみたいだが、そもそもなんでActiveXを有効にしないと効かないの?という疑問は沸く。たぶんアルファブレンドさせるための関数が、なんかのCOMオブジェクトの中に実装されてるからだろうな。

・・という覚書。個人的にはあんまりIE批判とかMS批判とかしないというか、元々DOSな人から俺は出発してるので世のMS叩きみたいな感情はないんだが、これはIEの実装ミスだと思うな、なんか。

「hogehoge.html」という名前のフォルダを作ってみる

マツゲ無しミウラ!

京商ランボ1のミウラ!

某ベンチャーのSEO対策の一環として、そのフォルダ構成というかディレクトリ構成を変えた。ところが問題発生。あるページにいろいろ他のサイトからリンクが集中してて、そのページがある想定キーワードでぐぐーる検索トップに来てたのが、来なくなった。

困った。リンクポピュラリティってのかな?が下がった?みたいなことになちゃった?

元のファイル、仮に「hogehoge.html」というページには「****のページは移動しました、数秒後にジャンプします。ジャンプしない場合は下記をクリックしてください」というのにしてジャンプを促すようにはした。そのリンクをたどってくる人には親切な作りにしたつもりだったが、WEBクローラーにとってはワンステップ増えることになるからか・・元の順位には戻らない。

リンクの張替えなどを依頼したいところだが、それも相手次第で対応に差があるし・・困った。

そこで考えて「hogehoge.html」というフォルダを作って、その中にページジャンプをする「index.php」を入れた。これで元ファイルのリンクを裏切ることなく、さらにWEBクローラーにも想定キーワードの含まれるページ内容を送ることになる。正攻法じゃないんだけど。

その効果は如何に?ってのはまたいずれ。

・・・「.htmlというフォルダを作る」って自分の発想に酔ってるのだけど、こういうのって普通のテクニックなのかな?

CHtmlViewでウィンドウをリサイズするとちらつき(flicker)が出るのを回避する方法

cms_lamborghini_countach_lp400_green.jpg

CM's ランボルギーニカウンタックLP400

RSSリーダのBlogPadや最近作ってる軽量タブブラウザのWebPadではブラウザ部にIEのエンジンをラップしたMFCクラスのCHtmlViewを使ってる。

あんまり気にしてなかったのだけど、このCHtmlViewがウィンドウのリサイズなどをするとものすごくちらつく。Flickerという奴なんですが、最近WebPadを作っててこのFlickerが気になりだした。

CHtmlViewはCFormViewを基本クラスに持っている。CFormViewはダイアログみたいなウィンドウ画面を提供するclassで、ダイアログプログラミングみたいにいろんなパーツを貼り付けて使うような使い方を想定している。どちらかといいうといろいろ部品を貼り付けて使うようなウィンドウなのでそういったクラスって画面描画を結構こまめに行う。部品の表示とかがおかしくならないように。

その上にWeb Browser Controlを貼り付けてるからちらつくのかなと、まずはWM_ERASEBKGNDの処理を変えてみた。背景処理のメッセージ。簡単にOnEraseBkgndで、デフォルトの処理はreturn CHtmlView::OnEraseBkgnd(); だけど、これを単にreturn TRUE;にした。

この処理はけっこういろんな俺ソフトでやっててちらつきには効果があるんだけど、あかんかった。なんもかわらん。

あっちこっち調べたけど、決定打になる解決法が見つからない。

結局、以下のような処理を今日、してみた。WM_SIZEとWM_SIZINGを処理するんだけど、

void CMyHtmlView::OnSize(UINT nType, int cx, int cy)
{
SetRedraw(FALSE);
CHtmlView::OnSize(nType, cx, cy);
SetRedraw();
}

void CMyHtmlView::OnSizing(UINT fwSide, LPRECT pRect)
{
SetRedraw(FALSE);
CHtmlView::OnSizing(fwSide, pRect);
SetRedraw();
}

今アップされてるWebPadとBlogPadにはこの処理を加えた。あってるかどうかわからないんだけど。

WebDAVフォルダに対してITEMIDLIST関係のAPIが効かない・・

bourbon_toyota2000gt_33_080323.jpg

[TOYOTA2000GT by ブルボン感動の名車]

メニュー型ランチャーのPWEXEはITEMIDLISTという、デスクトップを頂点とした仮想フォルダツリーで管理をしている。ITEMIDLISTは「item identifier list」の意味のようである。ITEMIDLISTはフォルダ表記で言えば「C:\ProgramFiles\N-soft」とか「\N-soft\PWEXE」とかみたいな感じで、ITEMIDはそのファイルとかフォルダの名前そのもの・・みたいな感じだったと思う(ちゃうかもしれん)。

ITEMIDLISTで管理しているので、例えばデスクトップをPWEXEの項目に追加すると、物理的なフォルダじゃないマイコンピュータやコントロールパネルなんかも下層にツリーで表示される。

PWEXEにフォルダが登録されると、PWEXEは内部では下層のフォルダやファイルはITEMIDLISTからIShellFolderというインターフェイスオブジェクトをまず取得。ついでIShellFolderが持つEnumObjectというメソッドで含まれるオブジェクト(つまりファイルやフォルダ)のITEMIDLISTの一覧を取得する。

さらにその下層にフォルダがあるときは、同様にIShellFolderオブジェクトをITEMIDLISTから取得して・・これを繰り返していく。

メニューを表示させるという目的だけなら、これで十分に機能していた。ところが・・・

マイネットワークの中にWebDAVフォルダがあるとき、メニュー上ではブラウズできるんだけど、フォルダを開こうとしたり、ファイルを実行しようとしたときにきちんと実行されない事を最近発見した。ちなみに、拡張子を指定してフォルダの、ある特定の拡張子のファイルのみを表示させようとしてもうまくいかないことも・・発見。全部表示させたらうまくいく。

ちなみに、拡張子の確認はSHGetPathFromIDListをつかってて、表示名の取得にはSHGetFileInfo、フォルダを開いたりファイルを実行したりにはShellExecuteExを使ってる。ShellExecuteExの中でも実行パスの指定にSHGetPathFromIDListを使ってたりする。表示名の取得にはどうせIShellFolderオブジェクトは取得しているので、GetDisplayNameOfメソッドを使えばいいんだけど、なんかうまくいかなかったので止めた・・と思う(ここらへん作ったの10年前くらいなので忘れた)。

まず、WebDAVフォルダに対してはSHGetPathFromIDListが効かない・・ようだ(ちゃんと確認してないけど)。困った・・俺の実用上はほとんど困らないんだけど。

ということでShellExecuteExをWebDAVフォルダ上のオブジェクトに対して適用するときは、実行パスの取得のためにSHGetPathFromIDListを使わないようにしていろいろ試したが・・駄目。SHGetPathFromIDListだけの問題じゃないようだ。

ちなみに、PWEXEはメニュー上で項目を選んで右クリックすると、ファイルやフォルダに応じたコンテキストメニューが出てくる。しかしWebDAV上のオブジェクトに対してコンテキストメニューを表示させて、メニュー上から「実行」を選んでもだめだった。(つまりIContextMenu::InvokeCommandを代替で使えないかと思ったんだが・・プロパティはちゃんと表示されるんだが・・)。

なんだかメソッドに統一性がない・・ような気がする。

GDI+のImage::FromFileで画像ファイルを読み込んだら、ファイルがロックされちゃうのを回避する件について

画像ビューアNIV(NSoft Image Viewer)ではGDI+ってのを使ってる。ちなみに画像ビューアNIVは各種画像ファイル(bmpとかJPGとか)を表示させるしか能がないビューアなんだけど、ウィンドウ枠なしという表示が出来るので、まぁそんなのが欲しいなって人には便利なソフトのはず。

ちなみに元々このブログのミニカーの立体写真を見るために開発した。

GDIってのは「Graphics Design Interface」の略で、Windowsで画像なんかで表示させるときに使う奴。グリグリと動くDirectXよりも、もっと抽象化された(例えばディスプレイ表示と印刷表示の違いを吸収してくれる)ようなAPI。GDI+ってのは「+」が付くくらいなので、その進化版みたいな意味なんだろきっと。

実はDirectXとか良く知らないけど、たぶんVBとC++の違いみたいに、ハードに近い層をいぢれるかどうかとか、そんな感じの差異だと勝手に想像している。

あんまりグリグリした処理のソフトはかつて作ったことがないので、GDI程度でN-Softさんは十分なのだが、GDI+を使ったほうが色んな画像フォーマットのファイルの読み込みが可能だったのでNIVには採用。

GDI+の使い方は・・訳分からん。呪文のように下記を導入。ちなみにVC6でMFCアプリの場合・・です。

呪文1)
StdAfx.hの下のほうに・・・
#include <gdiplus.h>
using namespace Gdiplus;
とか入れる。

呪文2)
CXXXAppのInitInstance()の最初のほうで・・・
 GdiplusStartup(&GdiToken, &GdiSi, NULL);
とか入れる。ちなみに、
 GdiplusStartupInput GdiSi;
 ULONG_PTR GdiToken;
はCXXXAppのメンバ関数として入れておく。ついでCXXXAppのExitInstanceで、
 GdiplusShutdown(GdiToken);
とか入れる。

ついで、最近ちょっとNIVを作り直してる。というか作り直した(近いうちに揚げます)。これまで、あるファイルをNIVで開いたら、その開いたファイルをロックしてそいつに対してなにも操作ができなくなって、結構これまずいかもと思ってたのだ。右クリックメニューで履歴のサムネイル表示なんかもNIVは出来るのだけど、サムネイル表示させたものもロックされてた。まぁメニュー表示させているときは他の操作はしないだろうと思ってほってたんだけど。

ちなみにこれまでは、以下のような感じで画像ファイルを読み込ませてた。
void ImageManager::LoadFile(CString filepath)
{
 image=Image::FromFile(filepath)
}

ちなみにimageは、画像管理のクラスとして勝手に定義しているImageManagerクラスのメンバ変数として、
 Image* image
みたいに定義してるんだけど。
でも、これだと読み込んだファイルが開放されるまでロックされちゃう。今までのNIVはこうなってた。

回避方法は、以下のようにする(注:一応ちょっと簡単に書いてるのでこれそのままだとエラー処理できてないす)。
ImageManagerクラスが、
 IStream* ptream;
 HGLOBAL mem;
 Image* image;
をメンバ関数にもつとして・・・

void ImageManager::LoadFile(CString filepath)
{
 CFile file(filepath,CFile::modeRead);
 DWORD size=file.GetLength();
 BYTE* buffer=new BYTE[size];
 file.Read((void*)buffer,size);
 file.Close()

アクセス傾向とか分析・・

今日はちょっとトラブル対処で某ベンチャーに来てる。ついでに某ベンチャーのWEBのメンテナンスというか、簡単なアクセス分析と、ちょっとしたSEO対策なんぞしている。基本の基本なんだけど、Google向けのサイトマップ作ったり、その他向けのRORファイル作ったり、登録したり、とかとかその程度だけど。

ああ、こんなこと書くとトラックバックスパムがきそう・・まぁいいか。

ところで、昨日からサークルKサンクスの京商フェラーリF1 IIの始まり~なので、こういうイベント時はこのブログはアクセスがどどっと増える。すいません、その情報少なくって・・俺箱買いしないから・・。

通常、検索エンジンから来る人は全体の4割くらい。しかし昨日今日は大体3割くらいに減ってる。毎回ミニカーイベント時には検索エンジンから来る人が減る傾向にある。潜在的常連さんがリンクを辿って来るからかな。

ちなみに検索エンジンで来る人の多くはGoogleからで、Yahoo JAPANはその半分くらい。ミニカーブログになっちゃったここだけど、プログラミング関係のキーワードで検索で来る人が1/3くらいは居るので、俺的には現状のネットな世界の中では健全な傾向?じゃないかと思ってる。やっぱITな人はまずググるだろうから。

で、今日の某ベンチャー。
アクセス傾向を見てると、検索エンジンで来る人の大半がYahoo JAPANから。Googleはその半分以下。

某ベンチャーはITリテラシーが高い人が求めるソリューションを提供している会社じゃない。ある業界の、大小さまざまな企業の、たぶんごく普通の人々が求めるものを提供している。

・・一般的日本人にとって、検索とは「Yahoo検索」を意味するんだろうなぁ。

パソコン買ったらブラウザにバンドル、デフォでアドオンされてるからだとか、そんな戦略も関係してるのかな?みたいなところにもう少し違ったビジネスチャンスがありそうな気がしないわけでもない。

と書きながら頭の中を整理して次、やるか・・
プロフィール

N-Soft

Author:N-Soft
最近の記事
カテゴリー
最近のコメント
リンク
RSSフィード
カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。