いずみちゃんどっとこむ プログラミング掲示板

過去ログ一覧

ATL&WTL (16)
1 名前:いずみ@インフォシティ 投稿日:2001/12/14(金) 12:02:18
 つーことで Template Libraries on Win32

2 名前:いずみ@インフォシティ 投稿日:2001/12/14(金) 12:03:16
 なんか最新のWin32 SDKから WTLが消えたそうな…
 アップグレードインストールするとWTLは完全消滅してしまうので要注意、だそーです。

※WTLとは? http://hp.vector.co.jp/authors/VA016589/wtl/

3 名前:いずみ@出向先 投稿日:2002/09/17(火) 00:05:18
すっかり死んでたこの板ですが^^;; メモ用にヒソカにフカーツ

DirectShowとWTLを併用するばやい、CWindowImpl::SubclassWindow() とか CDCT::SelectFont() とかはインクルード前に #define _INC_WINDOWSX と定義すれば使える。

4 名前:いずみ@出向先 投稿日:2002/09/17(火) 00:07:58
こんなクラス作ってみますた。

class CContextMenu : public CMenu
{
private:
  CMenuHandle parent;
  // 禁止
  void Attach(HMENU);
  HMENU Detach();
  CContextMenu(HMENU hMenu = 0);
  CContextMenu& operator=(HMENU);
public:
  CContextMenu(UINT res_id, int index = 0)
  {
    if (!LoadMenu(res_id))
    {
      ATLASSERT(false);
      return;
    }
    HMENU submenu = GetSubMenu(index);
    if (submenu)
    {
      parent = m_hMenu;
      m_hMenu = submenu;
    }
    else
    {
      ATLASSERT(false);
      CMenu::DestroyMenu();
    }
  }
  BOOL DestroyMenu()
  {
    m_hMenu = 0;
    return parent.DestroyMenu();
  }
  ~CContextMenu() { DestroyMenu(); }
};

5 名前:いずみ@出向先 投稿日:2002/09/18(水) 10:18:49
こんなのつくりました2

class CMouseTracker
{
private:
  CWindow owner;
  CPoint prev_lefttop;
  CPoint prev_mouse_pos;
public:
  bool Begin(HWND owner_, int x, int y)
  {
    if (owner.IsWindow() && GetCapture() == owner)  return false;
    owner = owner_;
    prev_mouse_pos.x = x;
    prev_mouse_pos.y = y;
    owner.ClientToScreen(&prev_mouse_pos);
    prev_lefttop.x = prev_mouse_pos.x - x;
    prev_lefttop.y = prev_mouse_pos.y - y;
    owner.SetCapture();
    return true;
  }
  bool Begin(HWND owner_, LPARAM lparam) { return Begin(owner_, GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); }
  bool MouseMove(int x, int y)
  {
    if (!owner.IsWindow() || GetCapture() != owner)  return false;
    CPoint pt(x, y);
    owner.ClientToScreen(&pt);
    if (pt != prev_mouse_pos)
    {
      prev_lefttop += pt - prev_mouse_pos;
      prev_mouse_pos = pt;
      owner.SetWindowPos(0, prev_lefttop.x, prev_lefttop.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
    }
    return true;
  }
  bool MouseMove(LPARAM lparam) { return MouseMove(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); }
  bool End()
  {
    if (!owner.IsWindow() || GetCapture() != owner)  return false;
    ReleaseCapture();
    owner.Detach();
    return true;
  }
};

6 名前:いずみ@出向先 投稿日:2002/09/18(水) 21:49:13
起動直後、メインフレームを作ったときのWM_CREATE内で、CCommandBarCtrlメニューにつけかえた後 SetMenu(0) すると、WM_SIZE が発生する。なぜだ!?!?

#けっこー苦しめられた(苦笑)

7 名前:いずみ@出向先 投稿日:2002/10/01(火) 03:05:50
Win32 genericですが。いわゆるミューテクスとモニタ。

class CCriticalSection : protected CRITICAL_SECTION
{
public:
  CCriticalSection() { ::InitializeCriticalSection(this); }
  ~CCriticalSection() { ::DeleteCriticalSection(this); }
  void Lock() { ::EnterCriticalSection(this); }
  void Unlock() { ::LeaveCriticalSection(this); }
};

class CLock
{
private:
  CCriticalSection& cs;
public:
  CLock(CCriticalSection& cs_) : cs(cs_) { cs.Lock(); }
  ~CLock() { cs.Unlock(); }
};

使うときは、

CCriticalSection ts;
void hogehoge()
{
  CLock l(cs);
  // スレッドセーフな処理をここに書く
}

8 名前:いずみ@出向先 投稿日:2002/10/01(火) 11:25:11
で、これで整数をスレッドセーフにする。

template <typename T> class CSafeInt
{
private:
  mutable CCriticalSection cs;
  T value;
public:
  CSafeInt(T initial_value = 0) : value(initial_value) {}
  operator T() const { CLock l(cs); return value; }
  T operator=(T new_value) { CLock l(cs); return value = new_value; }
  T Set(T value_) { CLock l(cs); std::swap(value, value_); return value_; }
};

ついでにWTL::CStringも。手抜きですが。
(ぢつわ std:basic_string 拡張版の TCHAR対応クラスは別途持ってるのですが)

namespace WTL {
class CSafeString : public CString
{
private:
  mutable CCriticalSection cs;
  operator LPCTSTR() const { return CString::operator LPCTSTR(); }
  TCHAR GetAt(int) const;
  TCHAR operator[](int) const;
  void SetAt(int, TCHAR);
public:
  CSafeString() {}
  CSafeString(const CString& src) : CString(src) {}
  CSafeString(TCHAR ch, int nRepeat = 1) : CString(ch, nRepeat) {}
  CSafeString(LPCTSTR str, int nLength) : CString(str, nLength) {}
  CSafeString(LPCSTR str) : CString(str) {}
  CSafeString(LPCWSTR str) : CString(str) {}
  CSafeString(const CSafeString& src) : CString(src) {}
  int GetLength() const { CLock l(cs); return CString::GetLength(); }
  bool IsEmpty() const { CLock l(cs); return CString::IsEmpty() != 0; }
  void Empty() { CLock l(cs); CString::Empty(); }
  CString Get() const { CLock l(cs); return CString(static_cast<LPCTSTR>(*this)); }
  CComBSTR GetW() const { CLock l(cs); return CComBSTR(static_cast<LPCTSTR>(*this)); }
  void CopyTo(CSafeString& dst) const { dst = *this; }
  void CopyTo(CString& dst) const { CLock l(cs); dst = static_cast<const CString&>(*this); }
  void CopyTo(CComBSTR& dst) const { CLock l(cs); dst = static_cast<LPCTSTR>(*this); }
  void operator=(const CSafeString& src) { CLock l(cs); CLock l2(src.cs); CString::operator=(src); }
  void operator=(const CString& src) { CLock l(cs); CString::operator=(src); }
  void operator=(TCHAR src) { CLock l(cs); CString::operator=(src); }
  void operator=(LPCSTR src) { CLock l(cs); CString::operator=(src); }
  void operator=(LPCWSTR src) { CLock l(cs); CString::operator=(src); }
  void operator+=(const CSafeString& src) { CLock l(cs); CString::operator+=(src); }
  void operator+=(const CString& src) { CLock l(cs); CString::operator+=(src); }
  void operator+=(TCHAR src) { CLock l(cs); CString::operator+=(src); }
  void operator+=(LPCTSTR src) { CLock l(cs); CString::operator+=(src); }
};
}

9 名前:元バイトのK 投稿日:2002/12/09(月) 22:10:40
ただいまATL7.0を解析中。
いいですね、7.0。
さすがにいきなりバージョンが4もあがっただけのことはありますね。

10 名前:いずみ 投稿日:2003/01/24(金) 09:43:27
最近、WTLとはとんとご無沙汰であります。。。
つーか、今後はWTLは使わない方向でっせ、ここの会社。。。(^^;;;;;)

11 名前:元バイトのK 投稿日:2003/01/29(水) 10:00:58
WTLともとうとうお別れですかねぇ。
.NETフレームワークなどに流れちまうんでしょうか。。。

12 名前:いずみ 投稿日:2003/02/27(木) 11:38:57
えー、イベントの引数に BSTR* を指定して、「接続ポイントのインプリメント」選ぶと、CComVariantに BSTR* を突っ込もうとして「代入演算子がねーぞゴルァ」って怒られるんですけど(苦笑)。

13 名前:元バイトのK 投稿日:2003/03/11(火) 16:37:04
なぜにBSTR*を?
イベントのディスパッチ先にBSTRの内容を書き換えさせるってことですか??
でもそれだと複数クライアントがいた場合に最後にディスパッチしたクライアントでの変更しか有効にならないし。
つーかvariantにBSTR*型なんてありましたっけ??

14 名前:いずみ@自宅作業 投稿日:2003/03/11(火) 22:45:30
>イベントのディスパッチ先にBSTRの内容を書き換えさせるってことですか??

園十里

>でもそれだと複数クライアントがいた場合に最後にディスパッチしたクライアントでの変更しか有効にならないし。

そういう用途は不要なので考えてません

>つーかvariantにBSTR*型なんてありましたっけ??

anonymous union member pbstrVal がそうやね。
VT_BYREF|VT_BSTRで使う。

15 名前:元バイトのK 投稿日:2003/03/18(火) 17:32:53
CComVariantはそんなの考えてねーよ!
ってのが答えなんですかね。
CComVariantのソースをまだ見てないのでなんともいえませんが。。。

16 名前:元バイトのK 投稿日:2003/12/18(木) 00:47:30
ついに出た出たWTL7.1

Script: mjuz float bbs ver.1.32