2011年9月26日月曜日

MFC の SendMessage

class CHogeDoc : CDocument で、
void CHogeDoc::changed() {
 ...(処理)...
 UpdateAllViews(NULL);
}
が別のスレッドから呼び出されると、CHandleMap が参照できず Assertion failed する。
UpdateAllViews を SendMessage を使って呼び出したいのだが、どうすればいいのか?

CWnd::SendMessage を使うのがいい。
CHogeView にメッセージを登録して、そこから update させる。回りくどい。
ユーザー定義メッセージは手動で登録する。
#define WM_USER_ONCHANGED (WM_USER + 1)

Header:
class CHogeView {
 ...
 afx_msg LRESULT onChanged(WPARAM wParam, LPARAM lParam);
}

Source:
IMPLEMENT_DYNCREATE(CHogeView, CView)

BEGIN_MESSAGE_MAP(CHogeView, CView)
 ON_MESSAGE(WM_USER_ONCHANGED, &CHogeView::onChanged) // ON_COMMAND ではない
END_MESSAGE_MAP()

...

LRESULT CHogeView::onChanged(WPARAM wParam, LPARAM lParam) {
 InvalidateRect(NULL);
}

2011年9月21日水曜日

Net::HTTP の accept-encoding を指定する。

https://luna.easyjp.net/projects/memo/wiki/ruby/net_http-gzip
Net::HTTP.start(uri.host, uri.port){|http|
  opts = {
    "Accept-Encoding" => "gzip",  # これによりサーバへgzipを要求する
    "User-Agent" => "Ruby/Downloader"
  }

  response = http.get(uri.request_uri, opts)
  unless response.is_a?(Net::HTTPOK)
    raise "response error!, #{response.code}"
  end

  if response["Content-Encoding"] == "gzip"
    StringIO.open(response.body, 'rb'){|f|
      content =  Zlib::GzipReader.wrap(f).read
    }
    use_gzip = true
  else
    content = response.body
  end
}

コモンダイアログのカスタマイズ

VC++テクニック : コモンダイアログのカスタマイズ

2011年9月7日水曜日