Changeset 772 in dev for trunk


Ignore:
Timestamp:
Aug 29, 2009, 7:55:19 AM (15 years ago)
Author:
イグトランス (egtra)
Message:

Windows 7タスクバーへの対応を実装。
(#245)

Location:
trunk/ab5.0/abdev/abdev
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/abdev/Backup.cpp

    r629 r772  
    111111        //ドキュメント セレクト コンボボックスから消去
    112112        extern HWND hDocCombo;
    113         i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum]->title.c_str());
     113        i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LPARAM)MdiInfo[WndNum]->title.c_str());
    114114        SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
    115115
     
    141141        TabColor=pobj_nv->pobj_ExtLink->GetTabColorFromFilePath(MdiInfo[WndNum]->path);
    142142        pobj_MainTab->DeleteItem( szOldTitle, false );
    143         pobj_MainTab->InsertItem( MdiInfo[WndNum]->title.c_str(), false, TabColor );
     143        pobj_MainTab->InsertItem( hChild, MdiInfo[WndNum]->title.c_str(), false, TabColor );
    144144
    145145        MdiInfo[WndNum]->pMdiTextEdit->Modify();
  • trunk/ab5.0/abdev/abdev/Common.h

    r717 r772  
    727727
    728728//DrawBuffer.cpp
    729 void TextEdit_DrawBuffer(HDC hdc,int WndNum);
     729void TextEdit_DrawBuffer(HDC hdc,int WndNum,bool drawDirectly=false);
    730730
    731731//TextEditor.cpp
  • trunk/ab5.0/abdev/abdev/DrawBuffer.cpp

    r771 r772  
    2323public:
    2424    HDC memdc;
    25     CDrawReserve(int WndNum,HDC _hDC,int cx,int cy,int ctrl_tab_space,int nMaxOnePageChar,int linenum_textcount,BOOL isRemoteSession){
     25    CDrawReserve(int WndNum,HDC _hDC,int cx,int cy,int ctrl_tab_space,int nMaxOnePageChar,int linenum_textcount,bool drawDirectly){
    2626        m_WndNum=WndNum;
    2727        x=-1;
     
    3434        iMax_OneLine_TextLength=cx/font_width+1;
    3535        iLineNumberTextCount=linenum_textcount;
    36         if(isRemoteSession){
     36        if(drawDirectly){
    3737            hdc=0;
    38             memdc=_hDC;
     38            memdc=_hDC; // メモリDCを使わず、直接描画する
    3939        }
    4040        else{
     
    273273};
    274274
    275 void TextEdit_DrawBuffer(HDC hdc,int WndNum){
     275void TextEdit_DrawBuffer(HDC hdc,int WndNum,bool drawDirectly){
    276276    int i,i2;
    277277    int x,y;
     
    307307        OnePage_CharHeight,
    308308        iLineNumberTextCount,
    309         GetSystemMetrics(SM_REMOTESESSION));
     309        drawDirectly || GetSystemMetrics(SM_REMOTESESSION));
    310310
    311311
  • trunk/ab5.0/abdev/abdev/FileOperation.cpp

    r717 r772  
    524524        color=pobj_MainTab->GetItemColor(oldTitle.c_str());
    525525        pobj_MainTab->DeleteItem( oldTitle.c_str(), false );
    526         pobj_MainTab->InsertItem( MdiInfo[WndNum]->title.c_str(), false, color );
     526        pobj_MainTab->InsertItem( hChild, MdiInfo[WndNum]->title.c_str(), false, color );
    527527    }
    528528    else{
  • trunk/ab5.0/abdev/abdev/IconEditor.cpp

    r705 r772  
    346346    mdic.lParam=0;
    347347    mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
    348     hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(long)&mdic);   //ウィンドウ作成
     348    hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(LPARAM)&mdic); //ウィンドウ作成
    349349
    350350    ////////////////////
     
    440440
    441441    //タブに追加
    442     pobj_MainTab->InsertItem( str, true );
     442    pobj_MainTab->InsertItem( hChild, str, true );
    443443
    444444    SetStatusText(NULL);
  • trunk/ab5.0/abdev/abdev/MenuProc.cpp

    r629 r772  
    229229    mdic.lParam=0;
    230230    mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
    231     hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(long)&mdic);   //ウィンドウ作成
     231    hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(LPARAM)&mdic); //ウィンドウ作成
    232232
    233233
     
    291291
    292292    //タブに追加
    293     pobj_MainTab->InsertItem( pMenuInfo->IdName, true );
     293    pobj_MainTab->InsertItem( hChild, pMenuInfo->IdName, true );
    294294
    295295    SetFocus(hListWnd);
  • trunk/ab5.0/abdev/abdev/RadProc.cpp

    r629 r772  
    4747    mdic.lParam=0;
    4848    mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
    49     hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(long)&mdic);   //ウィンドウ作成
     49    hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(LPARAM)&mdic); //ウィンドウ作成
    5050
    5151
     
    140140
    141141    //タブに追加
    142     pobj_MainTab->InsertItem( windowInfo.GetName().c_str(), true );
     142    pobj_MainTab->InsertItem( hChild, windowInfo.GetName().c_str(), true );
    143143
    144144    //メニュー状態を設定
     
    784784    SIZE size;
    785785    SCROLLINFO ScrollInfo,si2;
    786     PAINTSTRUCT ps;
    787786    POINTANDSIZE PointAndSize;
    788787
     
    793792
    794793                SetFocus(hwnd);
    795                 mouse.x=LOWORD(lParam);
    796                 mouse.y=HIWORD(lParam);
     794                mouse.x=GET_X_LPARAM(lParam);
     795                mouse.y=GET_Y_LPARAM(lParam);
    797796                CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
    798797
     
    872871
    873872                SetFocus(hwnd);
    874                 mouse.x=(int)(short)LOWORD(lParam);
    875                 mouse.y=(int)(short)HIWORD(lParam);
     873                mouse.x=GET_X_LPARAM(lParam);
     874                mouse.y=GET_Y_LPARAM(lParam);
    876875                CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
    877876
     
    14661465        case WM_MOUSEMOVE:
    14671466            {
    1468                 mouse.x=(int)(short)LOWORD(lParam);
    1469                 mouse.y=(int)(short)HIWORD(lParam);
     1467                mouse.x=GET_X_LPARAM(lParam);
     1468                mouse.y=GET_Y_LPARAM(lParam);
    14701469                CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
    14711470
     
    16311630        case WM_LBUTTONDBLCLK:
    16321631            {
    1633                 mouse.x=LOWORD(lParam);
    1634                 mouse.y=HIWORD(lParam);
     1632                mouse.x=GET_X_LPARAM(lParam);
     1633                mouse.y=GET_Y_LPARAM(lParam);
    16351634                CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
    16361635
     
    18161815            return 0;
    18171816        case WM_PAINT:
     1817            {
     1818                WTL::CPaintDC dc(hwnd);
     1819                SendMessage(hwnd, WM_PRINTCLIENT, reinterpret_cast<WPARAM>(dc.m_hDC), 0);
     1820                return 0;
     1821            }
     1822        case WM_PRINTCLIENT:
    18181823            i=GetWndNum(GetParent(hwnd));
    1819             if(i==-1) return 0; //ウィンドウが初期状態の場合
     1824            if(i==-1) break;    //ウィンドウが初期状態の場合
    18201825            i2=GetWndInfoNum(MdiInfo[i]->path);
    18211826
     
    18271832            GetScrollInfo(hwnd,SB_HORZ,&si2);
    18281833
    1829             hdc=BeginPaint(hwnd,&ps);
     1834            hdc=reinterpret_cast<HDC>(wParam);
    18301835            BitBlt(hdc,0,0,ScreenX*2,ScreenY*2,
    18311836                MdiInfo[i]->MdiRadInfo->hMemDC,si2.nPos,ScrollInfo.nPos,SRCCOPY);
    1832             EndPaint(hwnd,&ps);
    18331837
    18341838            if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE||MdiInfo[i]->MdiRadInfo->ButtonSelect==NON_TOOL)
     
    18451849
    18461850            if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE){
    1847                 mouse.x=LOWORD(lParam);
    1848                 mouse.y=HIWORD(lParam);
     1851                mouse.x=GET_X_LPARAM(lParam);
     1852                mouse.y=GET_Y_LPARAM(lParam);
    18491853                ScreenToClient(hwnd,&mouse);
    18501854                CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
     
    18531857                extern HMENU hRadMenuBase;
    18541858                if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
    1855                     TrackPopupMenu(GetSubMenu(hRadMenuBase,0),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
    1856                 else TrackPopupMenu(GetSubMenu(hRadMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
     1859                    TrackPopupMenu(GetSubMenu(hRadMenuBase,0),TPM_LEFTALIGN,GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),0,hwnd,0);
     1860                else TrackPopupMenu(GetSubMenu(hRadMenuBase,1),TPM_LEFTALIGN,GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),0,hwnd,0);
    18571861            }
    18581862            return 0;
     
    19891993        case WM_CREATE:
    19901994            extern HICON hWindowDocumentIcon;
    1991             SendMessage(hwnd,WM_SETICON,ICON_SMALL,(long)hWindowDocumentIcon);
     1995            SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)hWindowDocumentIcon);
    19921996            break;
    19931997        case WM_MDIACTIVATE:
     
    19962000            if(i==-1) return 0; //ウィンドウが初期状態の場合
    19972001
    1998             i=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i]->title.c_str());
     2002            i=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LPARAM)MdiInfo[i]->title.c_str());
    19992003            SendMessage(hDocCombo,CB_SETCURSEL,i,0);
    20002004            SetStatusText(NULL);
  • trunk/ab5.0/abdev/abdev/Ruler.cpp

    r655 r772  
    33#include "common.h"
    44
     5void OnPaint(HWND hwnd,HDC hdc)
     6{
     7    CRuler *pobj_Ruler = reinterpret_cast<CRuler *>(GetWindowLongPtr(hwnd,GWLP_USERDATA));
     8    pobj_Ruler->draw(hdc);
     9}
     10
    511LRESULT CALLBACK RulerProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
    612    switch(message){
    713        case WM_PAINT:
    8             CRuler *pobj_Ruler;
    9             pobj_Ruler=(CRuler *)GetWindowLongPtr(hwnd,GWLP_USERDATA);
    10 
    11             HDC hdc;
    1214            PAINTSTRUCT ps;
    13             hdc=BeginPaint(hwnd,&ps);
    14 
    15             pobj_Ruler->draw(hdc);
    16 
     15            OnPaint(hwnd,BeginPaint(hwnd,&ps));
    1716            EndPaint(hwnd,&ps);
     17            break;
     18        case WM_PRINTCLIENT:
     19            OnPaint(hwnd, reinterpret_cast<HDC>(wParam));
    1820            break;
    1921    }
     
    2830        0,0,0,0,
    2931        hParent,0,hInst,0);
    30     SetWindowLongPtr(hRulerWnd,GWLP_USERDATA,(long)this);
     32    SetWindowLongPtr(hRulerWnd,GWLP_USERDATA,(LONG_PTR)this);
    3133
    3234    HDC hdc;
  • trunk/ab5.0/abdev/abdev/SubOperation.cpp

    r705 r772  
    153153}
    154154void SlideString(char *buffer, int slide){
    155     char *temp;
    156     temp=(char *)malloc(lstrlen(buffer)+1);
    157     lstrcpy(temp,buffer);
    158     lstrcpy(buffer+slide,temp);
    159     free(temp);
     155    SlideBuffer(buffer, strlen(buffer) + 1, slide);
    160156}
    161157void SlideBuffer(char *buffer,int length,int slide){
    162     void *temp;
    163     temp=malloc(length+1);
    164     memcpy(temp,buffer,length);
    165     memcpy(buffer+slide,temp,length);
    166     free(temp);
     158    memmove(buffer+slide, buffer, length);
    167159}
    168160BOOL IsVariableTopChar(char c){
     
    745737    extern FWINLAYER pSetLayeredWindowAttributes;
    746738    extern HINSTANCE hUser32Lib;
    747     hUser32Lib=GetModuleHandle("user32.dll");
     739    hUser32Lib=GetModuleHandle(TEXT("user32.dll"));
    748740    pSetLayeredWindowAttributes=reinterpret_cast<FWINLAYER>(GetProcAddress(hUser32Lib,"SetLayeredWindowAttributes"));
    749741
     
    754746    // フォントを定義
    755747    /////////////////////
     748
     749    NONCLIENTMETRICS NCMetrics = {0};
     750    NCMetrics.cbSize = sizeof( NONCLIENTMETRICS );
     751    SystemParametersInfo( SPI_GETNONCLIENTMETRICS, NCMetrics.cbSize, &NCMetrics, 0 );
    756752
    757753    //パラメータ ヒント フォント
     
    764760
    765761    //ステータスバー フォント
    766     LOGFONT LogFont;
    767762    extern HFONT hStatusFont;
    768     LogFont.lfHeight=-12;
    769     LogFont.lfWidth=0;
    770     LogFont.lfEscapement=0;
    771     LogFont.lfOrientation=0;
    772     LogFont.lfWeight=FW_REGULAR;
    773     LogFont.lfItalic=NULL;
    774     LogFont.lfUnderline=NULL;
    775     LogFont.lfStrikeOut=NULL;
    776     LogFont.lfCharSet=SHIFTJIS_CHARSET;
    777     LogFont.lfOutPrecision=OUT_STRING_PRECIS;
    778     LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
    779     LogFont.lfQuality=DRAFT_QUALITY;
    780     LogFont.lfPitchAndFamily=VARIABLE_PITCH;
    781     sprintf(LogFont.lfFaceName,"MS Pゴシック");
    782     hStatusFont=CreateFontIndirect(&LogFont);
     763    hStatusFont=CreateFontIndirect(&NCMetrics.lfStatusFont);
    783764
    784765    //ハイパーリンク フォント
    785766    extern HFONT hHyperLinkFont;
     767    LOGFONT LogFont;
    786768    LogFont.lfHeight=-12;
    787769    LogFont.lfWidth=0;
     
    797779    LogFont.lfQuality=DRAFT_QUALITY;
    798780    LogFont.lfPitchAndFamily=VARIABLE_PITCH;
    799     sprintf(LogFont.lfFaceName,"MS Pゴシック");
     781    _tcscpy(LogFont.lfFaceName,TEXT("MS Pゴシック"));
    800782    hHyperLinkFont=CreateFontIndirect(&LogFont);
    801783
     
    815797    LogFont.lfQuality=DRAFT_QUALITY;
    816798    LogFont.lfPitchAndFamily=VARIABLE_PITCH;
    817     sprintf(LogFont.lfFaceName,"MS ゴシック");
     799    _tcscpy(LogFont.lfFaceName,TEXT("MS ゴシック"));
    818800    hRulerFont=CreateFontIndirect(&LogFont);
    819801
     
    833815    LogFont.lfQuality=DRAFT_QUALITY;
    834816    LogFont.lfPitchAndFamily=VARIABLE_PITCH;
    835     sprintf(LogFont.lfFaceName,"Courier New");
     817    _tcscpy(LogFont.lfFaceName,TEXT("Courier New"));
    836818    hFont_LineNumber=CreateFontIndirect(&LogFont);
    837819
    838820    //メニューフォント
    839     NONCLIENTMETRICS NCMetrics;
    840     int sizeof_NONCLIENTMETRICS = sizeof( NONCLIENTMETRICS );
    841 #if WINVER >= 0x0600
    842     sizeof_NONCLIENTMETRICS -= sizeof(int);
    843 #endif
    844     NCMetrics.cbSize = sizeof_NONCLIENTMETRICS;
    845     SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof_NONCLIENTMETRICS, &NCMetrics, 0 );
    846821    hMenuFont=CreateFontIndirect(&NCMetrics.lfMenuFont);
    847822
     
    11951170        WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBARS_SIZEGRIP|CCS_BOTTOM,
    11961171        NULL,hwnd,NULL);
    1197     SendMessage(hStatusBar,WM_SETFONT,(long)hStatusFont,0);
     1172    SetWindowFont(hStatusBar,hStatusFont,FALSE);
    11981173
    11991174    //プロジェクト ビュー
  • trunk/ab5.0/abdev/abdev/TabCtrl.cpp

    r700 r772  
    33#include "Common.h"
    44
     5struct ItemInfo
     6{
     7    HWND hwndChild;
     8    COLORREF Color;
     9
     10    ItemInfo( HWND hChild, COLORREF color) :
     11        hwndChild( hChild ),
     12        Color( color )
     13    {
     14    }
     15};
     16
     17ItemInfo* GetItemInfo( HWND hTab, int i )
     18{
     19    TC_ITEM tcItem;
     20    tcItem.mask=TCIF_PARAM;
     21    TabCtrl_GetItem( hTab, i, &tcItem );
     22    return reinterpret_cast<ItemInfo*>( tcItem.lParam );
     23}
     24
     25void SetTabOrder( HWND hTab, ItemInfo* itemInfo, int pos )
     26{
     27    HWND next =
     28        pos + 1 < TabCtrl_GetItemCount( hTab )
     29        ? GetItemInfo( hTab, pos + 1 )->hwndChild
     30        : 0
     31        ;
     32    ActiveBasic::IDE::Program::mainFrame.SetTabOrder( itemInfo->hwndChild, next );
     33}
    534
    635CMainTab *pobj_MainTab=0;
     
    5786
    5887                    indexDrag=iNewPos;
     88                    SetTabOrder( hwnd, GetItemInfo( hwnd, iNewPos ), iNewPos );
    5989
    6090                    LockWindowUpdate(0);
     
    148178
    149179    //サブクラス化
    150     OldMainTabWndProc=(WNDPROC)GetWindowLongPtr(hTab,GWLP_WNDPROC);
    151     SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)MainTabWndProc);
     180    OldMainTabWndProc = (WNDPROC)SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)MainTabWndProc);
    152181
    153182    //ボールド体フォントを生成
     
    157186    hBoldFont=CreateFontIndirect(&lf);
    158187
    159     SendMessage(hTab,WM_SETFONT,(long)hBoldFont,0);
     188    SetWindowFont(hTab,hBoldFont,FALSE);
    160189}
    161190
     
    164193}
    165194
    166 void CMainTab::InsertItem( const char *lpszText, bool isResize, COLORREF color ){
     195void CMainTab::InsertItem( HWND hwnd, const char *lpszText, bool isResize, COLORREF color ){
    167196    int sw=0;
    168197    if(TabCtrl_GetItemCount(hTab)==0) sw=1;
    169 
     198OutputDebugString("CMainTab::InsertItem--------------------------------------------------------\r\n");
    170199    if(color==-1) color=RGB(230,230,230);
     200
     201    ItemInfo* itemInfo = new ItemInfo( hwnd, color );
    171202
    172203    TC_ITEM tcItem;
    173204    tcItem.mask=TCIF_TEXT|TCIF_PARAM;
    174205    tcItem.pszText=(LPSTR)lpszText;
    175     tcItem.lParam=color;
     206    tcItem.lParam=reinterpret_cast<LPARAM>( itemInfo );
    176207    TabCtrl_InsertItem(hTab,0,&tcItem);
    177208    TabCtrl_SetCurSel(hTab,0);
     209    ActiveBasic::IDE::Program::mainFrame.AddChildWindow( hwnd );
     210    SetTabOrder( hTab, itemInfo, 0 );
    178211
    179212    if(isResize){
     
    186219    i2=SearchItemIndex(lpszText);
    187220    if(i2==-1) return;
    188 
     221OutputDebugString("CMainTab::DeleteItem--------------------------------------------------------\r\n");
     222    ItemInfo* p = GetItemInfo( hTab, i2 );
     223    ActiveBasic::IDE::Program::mainFrame.DeleteChildWindow( p->hwndChild );
     224    delete p;
    189225    TabCtrl_DeleteItem(hTab,i2);
    190226
     
    195231
    196232void CMainTab::RenameItem( const char *lpszOldText, const char *lpszNewText ){
    197     int i2;
    198     i2=SearchItemIndex(lpszOldText);
     233    int i2=SearchItemIndex(lpszOldText);
    199234    if(i2==-1) return;
    200235
     
    242277    tcItem.mask = TCIF_PARAM;
    243278    TabCtrl_GetItem( hTab, index, &tcItem );
    244     return tcItem.lParam;
     279    return reinterpret_cast<ItemInfo*>( tcItem.lParam )->Color;
    245280}
    246281
     
    272307
    273308    TabCtrl_SetCurSel(hTab,i2);
     309//  ActiveBasic::IDE::Program::mainFrame.ActivateChildWindow( *GetItemInfo( hTab, i2 )->TaskbarButtonWindow );
    274310}
    275311
     
    321357        // タブ枠を描画
    322358        ////////////////////////////
    323         colorGray=item.lParam;
     359        colorGray=reinterpret_cast<ItemInfo*>( item.lParam )->Color;
    324360
    325361        //ブラシを生成
     
    376412        // タブ枠を描画
    377413        ////////////////////////////
    378         colorGray=item.lParam;
     414        colorGray=reinterpret_cast<ItemInfo*>( item.lParam )->Color;
    379415
    380416        //ブラシを生成
  • trunk/ab5.0/abdev/abdev/TabCtrl.h

    r700 r772  
    1 
     1#pragma once
    22
    33class CMainTab{
     
    2323
    2424    //アイテムを挿入
    25     void InsertItem( const char *lpszText, bool isResize, COLORREF color = -1 );
     25    void InsertItem( HWND hwnd, const char *lpszText, bool isResize, COLORREF color = -1 );
    2626
    2727    //アイテムを削除
  • trunk/ab5.0/abdev/abdev/TextEditor_EventProc.cpp

    r770 r772  
    138138            TextEdit_DrawBuffer(hdc,WndNum);
    139139            EndPaint(hwnd,&ps);
     140            ActiveBasic::IDE::Program::mainFrame.InvalidateBitmap(GetParent(hwnd));
     141            return 0;
     142        case WM_PRINTCLIENT:
     143            WndNum=GetWndNum(GetParent(hwnd));
     144            if(WndNum==-1) return 0;
     145            TextEdit_DrawBuffer(reinterpret_cast<HDC>(wParam),WndNum);
    140146            return 0;
    141147        case WM_SETFOCUS:
     
    261267                MdiInfo[wParam]->pMdiTextEdit->pobj_WebResult->hwnd,0,hInst,0);
    262268
    263             SetWindowLongPtr(hOneTabWnd,GWLP_USERDATA,(long)lParam);
     269            SetWindowLongPtr(hOneTabWnd,GWLP_USERDATA,lParam);
    264270
    265271            return (LRESULT)hOneTabWnd;
  • trunk/ab5.0/abdev/abdev/abdev.cpp

    r705 r772  
    196196
    197197    if(MenuText){
    198         SendMessage(hStatusBar,SB_SETTEXT,0,(long)MenuText);
     198        SendMessage(hStatusBar,SB_SETTEXT,0,(LPARAM)MenuText);
    199199        if((char *)MenuText!=(char *)CmdMsg) CmdMsg[0]=0;
    200200    }
     
    979979    if( hDocCombo )
    980980    {
    981         i=SendMessage(hDocCombo,CB_ADDSTRING,0,(long)str);
     981        i=SendMessage(hDocCombo,CB_ADDSTRING,0,(LPARAM)str);
    982982        SendMessage(hDocCombo,CB_SETCURSEL,i,0);
    983983    }
    984984
    985985    //タブに追加
    986     pobj_MainTab->InsertItem( str, true, TabColor );
     986    pobj_MainTab->InsertItem( hChild, str, true, TabColor );
    987987
    988988    ::SetFocus(hEdit);
     
    10041004        }
    10051005    }
    1006 
     1006    UpdateWindow(hChild);
    10071007    return hChild;
    10081008}
     
    10141014    //ドキュメントコンボボックスから文字列を消去
    10151015    extern HWND hDocCombo;
    1016     i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum]->title.c_str());
     1016    i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LPARAM)MdiInfo[WndNum]->title.c_str());
    10171017    SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
    10181018
    10191019    //タブコントロールからアイテムを消去
    10201020    if(pobj_MainTab) pobj_MainTab->DeleteItem( MdiInfo[WndNum]->title.c_str(), true );
    1021 
    10221021
    10231022    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
     
    11511150        WebResultWndHeight);
    11521151}
     1152
    11531153LRESULT CALLBACK MDIClientWindow_TextEdit(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
    11541154    int i,i2;
     
    11571157    switch(message){
    11581158        case WM_CREATE:
    1159             CREATESTRUCT *lpcs;
    1160             lpcs=(CREATESTRUCT *)lParam;
    1161             MDICREATESTRUCT *lpmcs;
    1162             lpmcs=(MDICREATESTRUCT *)lpcs->lpCreateParams;
    1163             SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)lpmcs->lParam);
    1164             break;
     1159            {
     1160                CREATESTRUCT *lpcs = (CREATESTRUCT *)lParam;
     1161                MDICREATESTRUCT *lpmcs = (MDICREATESTRUCT *)lpcs->lpCreateParams;
     1162                SendMessage(hwnd,WM_SETICON,ICON_SMALL,lpmcs->lParam);
     1163
     1164                break;
     1165            }
    11651166        case WM_MDIACTIVATE:
    1166             //以前のMDIウィンドウのパラメータ ヒントを破棄する
    1167             if(MethodCheckInfo.hWnd){
    1168                 DestroyWindow(MethodCheckInfo.hWnd);
    1169                 MethodCheckInfo.hWnd=0;
    1170             }
    1171 
    1172             //以前のコード補完リストを破棄する
    1173             if(ComplementWndInfo.hWnd){
    1174                 DestroyWindow(ComplementWndInfo.hWnd);
    1175                 ComplementWndInfo.hWnd=0;
    1176             }
    1177 
    1178             if(!lParam) return 0;
    1179             i=GetWndNum((HWND)lParam);
    1180             if(i==-1) return 0; //ウィンドウが初期状態の場合
     1167            {
     1168                //以前のMDIウィンドウのパラメータ ヒントを破棄する
     1169                if(MethodCheckInfo.hWnd){
     1170                    DestroyWindow(MethodCheckInfo.hWnd);
     1171                    MethodCheckInfo.hWnd=0;
     1172                }
     1173
     1174                //以前のコード補完リストを破棄する
     1175                if(ComplementWndInfo.hWnd){
     1176                    DestroyWindow(ComplementWndInfo.hWnd);
     1177                    ComplementWndInfo.hWnd=0;
     1178                }
     1179
     1180                if(!lParam) return 0;
     1181                i=GetWndNum((HWND)lParam);
     1182                if(i==-1) return 0; //ウィンドウが初期状態の場合
    11811183
    11821184#ifndef THETEXT
    1183             //デバッガ メニューの状態を設定
    1184             pobj_Debugger->ResetCommandEnabled();
    1185 #endif
    1186 
    1187             //ドキュメント セレクト コンボボックス
    1188             extern HWND hDocCombo;
    1189             i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i]->title.c_str());
    1190             SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
    1191 
    1192             //タブコントロール
    1193             pobj_MainTab->MdiActiveEvent(MdiInfo[i]->title.c_str());
    1194 
    1195             if( !projectInfo.IsOpened() ){
    1196                 ResetClassTree((HTREEITEM)-1);
    1197             }
    1198 
    1199             return 0;
     1185                //デバッガ メニューの状態を設定
     1186                pobj_Debugger->ResetCommandEnabled();
     1187#endif
     1188
     1189                //ドキュメント セレクト コンボボックス
     1190                extern HWND hDocCombo;
     1191                i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LPARAM)MdiInfo[i]->title.c_str());
     1192                SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
     1193
     1194                //タブコントロール
     1195                pobj_MainTab->MdiActiveEvent(MdiInfo[i]->title.c_str());
     1196
     1197                if( !projectInfo.IsOpened() ){
     1198                    ResetClassTree((HTREEITEM)-1);
     1199                }
     1200                return 0;
     1201            }
    12001202        case WM_SETFOCUS:
    12011203            hEdit=GetWindow(hwnd,GW_CHILD);
     
    12441246    switch(message)
    12451247    {
    1246 
    12471248#ifndef THETEXT
    12481249        case WM_SETCOMPILEVIEW:
     
    12531254        case WM_DESTROYCOMPILEVIEW:
    12541255            //コンパイラウィンドウ(埋め込み型)が破棄されたとき
    1255             if((int)hCompileView==-1){
     1256            if((LONG_PTR)hCompileView==-1){
    12561257                //すぐに次のコンパイラウィンドウが起動するとき
    12571258                hCompileView=0;
     
    12601261                //完全にコンパイラウィンドウを閉じたときはリサイズ
    12611262                hCompileView=0;
    1262                
     1263
    12631264                ActiveBasic::IDE::Program::mainFrame.Resized();
    12641265            }
     
    13001301            static int start;
    13011302
    1302             pos.x=(long)(short)LOWORD(lParam);
    1303             pos.y=(long)(short)HIWORD(lParam);
     1303            pos.x=GET_X_LPARAM(lParam);
     1304            pos.y=GET_Y_LPARAM(lParam);
    13041305            ClientToScreen(hwnd,&pos);
    13051306
     
    13771378            return 0;
    13781379        case WM_LBUTTONDOWN:
    1379             pos.x=LOWORD(lParam);
    1380             pos.y=HIWORD(lParam);
     1380            pos.x=GET_X_LPARAM(lParam);
     1381            pos.y=GET_Y_LPARAM(lParam);
    13811382            ClientToScreen(hwnd,&pos);
    13821383
     
    15321533    if(!RegWndClass(SideWebProc,"SideWeb",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
    15331534
    1534     ActiveBasic::IDE::Program::Main();
     1535    ActiveBasic::IDE::Program::Main(hThisInst);
    15351536
    15361537    //return 0;
     
    15531554    SetTimer(hOwner,ID_TIMER_BACKUP,10000,NULL);
    15541555
    1555     SendMessage(hOwner,WM_SETICON,ICON_SMALL,(long)hOwnerIcon);
     1556    SendMessage(hOwner,WM_SETICON,ICON_SMALL,(LPARAM)hOwnerIcon);
    15561557    SetClipboardViewer(hOwner);
    15571558
     
    16381639#endif
    16391640
    1640     return msg.wParam;
    1641 }
     1641    return static_cast<int>(msg.wParam);
     1642}
  • trunk/ab5.0/abdev/abdev/abdev.vcproj

    r688 r772  
    8383                SuppressStartupBanner="true"
    8484                AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
     85                DelayLoadDLLs="DWMAPI.DLL"
    8586                ProgramDatabaseFile="$(IntDir)\$(ProjectName).pdb"
    8687                SubSystem="2"
     
    182183                SuppressStartupBanner="true"
    183184                AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
     185                DelayLoadDLLs="DWMAPI.DLL"
    184186                GenerateDebugInformation="true"
    185187                ProgramDatabaseFile="$(IntDir)\$(ProjectName).pdb"
     
    282284                SuppressStartupBanner="true"
    283285                AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
     286                DelayLoadDLLs="DWMAPI.DLL"
    284287                ProgramDatabaseFile="$(IntDir)\$(ProjectName).pdb"
    285288                SubSystem="2"
     
    381384                SuppressStartupBanner="true"
    382385                AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
     386                DelayLoadDLLs="DWMAPI.DLL"
    383387                GenerateDebugInformation="true"
    384388                ProgramDatabaseFile="$(IntDir)\$(ProjectName).pdb"
  • trunk/ab5.0/abdev/abdev/include/MainFrame.h

    r749 r772  
    11#pragma once
     2
     3#include <boost/shared_ptr.hpp>
    24
    35//サイズ変更枠の太さ
     
    1416#define WM_SETDEBUGGERVIEW      WM_USER+75  //デバッガウィンドウが表示されたとき
    1517#define WM_DESTROYDEBUGGERVIEW  WM_USER+76  //デバッガウィンドウが表示されたとき
     18
     19#ifdef HAVE_WINDOWS_7_SDK
     20class TaskbarList;
     21#endif
    1622
    1723namespace ActiveBasic{ namespace IDE{
     
    2228{
    2329    WindowAreaManager wam;
     30    UINT TaskbarButtonCreated;
     31#ifdef HAVE_WINDOWS_7_SDK
     32    boost::shared_ptr<TaskbarList> taskbarList;
     33#endif
    2434
    2535public:
     36    MainFrame();
     37
    2638    // リサイズ時のリフレッシュ
    2739    void Resized();
     
    7789    // ソースコード表示メッセージ
    7890    ::LRESULT OnShowSourceLine( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled );
     91
     92#ifdef HAVE_WINDOWS_7_SDK
     93    // タスクバーボタンが生成された
     94    ::LRESULT OnTaskbarButtonCreated(::UINT msg, ::WPARAM wParam, ::LPARAM lParam);
     95
     96    // 子ウィンドウが生成された
     97    void AddChildWindow( HWND hwndChild );
     98
     99    // 子ウィンドウが破棄された
     100    void DeleteChildWindow( HWND hwndChild );
     101
     102    // 子ウィンドウがアクティブになった
     103    void ActivateChildWindow( HWND hwndChild );
     104
     105    // タブの順序が変更になった
     106    void SetTabOrder( HWND hwndChild, HWND hwndInsertBefore );
     107
     108    // サムネイル画像が古くなった(ので更新したい)
     109    void InvalidateBitmap( HWND hwndChild );
     110#endif
    79111
    80112    // 「新規作成」メニューがクリックされた
     
    269301        MSG_WM_DROPFILES( OnDropFiles )
    270302        MSG_WM_PAINT( OnPaint )
    271         MESSAGE_HANDLER( WM_SHOWERROR, OnShowSourceLine )
    272 
     303        MESSAGE_HANDLER( WM_SHOWERROR, OnShowSourceLine )   
     304#ifdef HAVE_WINDOWS_7_SDK
     305        MESSAGE_HANDLER_EX( TaskbarButtonCreated, OnTaskbarButtonCreated )
     306#endif
    273307        COMMAND_ID_HANDLER_EX( IDM_NEW, OnCmdNew )
    274308        COMMAND_ID_HANDLER_EX( IDM_OPEN, OnCmdOpen )
  • trunk/ab5.0/abdev/abdev/include/Program.h

    r719 r772  
    1919    static const std::string GetIdeUserAppDir();
    2020
    21     static void Main();
     21    static void Main(HINSTANCE hinst);
    2222
    2323
  • trunk/ab5.0/abdev/abdev/src/MainFrame.cpp

    r749 r772  
    1010void CreateProcessWithStdHandle( const std::string &appPath, const std::string &cmdLine, bool isShowWindow = true )
    1111{
    12     std::string argsStr = "\"" + appPath + "\" " + cmdLine;
     12    std::string argsStr = '\"' + appPath + "\" " + cmdLine;
    1313    STARTUPINFO si;
    1414    PROCESS_INFORMATION pi;
     
    2121    si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    2222   
    23     char args[8192];
    24     lstrcpy( args, argsStr.c_str() );
    25 
    26     CreateProcess( NULL, args, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi );
     23    std::vector<char> args( argsStr.c_str(), argsStr.c_str() + argsStr.size() + 1 );
     24
     25    CreateProcess( NULL, &args[0], NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi );
    2726    CloseHandle( pi.hProcess );
    2827    CloseHandle( pi.hThread );
    2928}
     29
     30#ifdef HAVE_WINDOWS_7_SDK
     31
     32#define MSGFLT_ADD 1
     33
     34#pragma push_macro("_WIN32_WINNT")
     35#undef _WIN32_WINNT
     36#define _WIN32_WINNT 0x0601
     37#include <dwmapi.h>
     38#pragma pop_macro("_WIN32_WINNT")
     39
     40#define WM_DWMSENDICONICTHUMBNAIL 0x0323
     41#define WM_DWMSENDICONICLIVEPREVIEWBITMAP 0x0326
     42
     43// Windows 7タスクバーにボタンとして表示させるためのウィンドウ。
     44// 各MDI子ウィンドウ (wndTarget) と1対1に対応する。
     45class DummyWindowForTaskbarButton : public ATL::CWindowImpl<DummyWindowForTaskbarButton>, boost::noncopyable
     46{
     47public:
     48    DECLARE_WND_CLASS(TEXT("DummyWindow For Taskbar Button"));
     49
     50    BEGIN_MSG_MAP(DummyWindowForTaskbarButton)
     51        MESSAGE_HANDLER_EX(WM_DWMSENDICONICTHUMBNAIL, OnDwmSendIconicThumnail)
     52        MESSAGE_HANDLER_EX(WM_DWMSENDICONICLIVEPREVIEWBITMAP, OnDwmSendIconicLivePreviewBitmap)
     53        MSG_WM_ACTIVATE(OnActivate)
     54    END_MSG_MAP()
     55
     56    explicit DummyWindowForTaskbarButton(HWND hwndTarget, const char* title) :
     57        wndTarget(hwndTarget)
     58    {
     59        HWND hwndDummy = Create( hOwner, CRect( -32000, -32000, 1, 1 ), title,
     60            WS_BORDER | WS_SYSMENU | WS_CAPTION, WS_EX_NOACTIVATE);
     61        SetIcon( wndTarget.GetIcon( FALSE ), FALSE );
     62        SetIcon( wndTarget.GetIcon( TRUE ), TRUE );
     63
     64        BOOL iconicRepresentation = TRUE;
     65        HRESULT hr;
     66        hr = DwmSetWindowAttribute(
     67            *this,
     68            DWMWA_FORCE_ICONIC_REPRESENTATION,
     69            &iconicRepresentation,
     70            sizeof iconicRepresentation);
     71        BOOL iconicBitmap = TRUE;
     72        hr = DwmSetWindowAttribute(
     73            *this,
     74            DWMWA_HAS_ICONIC_BITMAP,
     75            &iconicBitmap,
     76            sizeof iconicBitmap);
     77    }
     78
     79    ~DummyWindowForTaskbarButton()
     80    {
     81    }
     82private:
     83    void OnActivate(UINT state, BOOL /*minimized*/, HWND /*hwndOther*/)
     84    {
     85        if (state == WA_ACTIVE)
     86        {
     87            if (ActiveBasic::IDE::Program::mainFrame.IsIconic())
     88            {
     89                ActiveBasic::IDE::Program::mainFrame.ShowWindow(SW_RESTORE);
     90            }
     91            SetForegroundWindow(ActiveBasic::IDE::Program::mainFrame);
     92            ActiveBasic::IDE::Program::mainFrame.MDIActivate(wndTarget);
     93            wndTarget.Invalidate(FALSE);
     94        }
     95    }
     96
     97    class BitmapMemoryDC : public WTL::CDC, boost::noncopyable
     98    {
     99    public:
     100        explicit BitmapMemoryDC(HBITMAP hbmp) :
     101            WTL::CDC(::CreateCompatibleDC(0)),
     102            bmp(hbmp),
     103            hbmpOld(SelectBitmap(bmp))
     104        {
     105        }
     106        BitmapMemoryDC(int width, int height, void*& bits) :
     107            WTL::CDC(::CreateCompatibleDC(0)),
     108            bmp(CreateDIBSection32(m_hDC, width, height, bits)),
     109            hbmpOld(SelectBitmap(bmp))
     110        {
     111        }
     112        ~BitmapMemoryDC()
     113        {
     114            SelectBitmap(hbmpOld); // この後、CDCとbmpのデストラクタでそれぞれDeleteDCとDeleteObjectがなされる。
     115        }
     116        WTL::CBitmap& GetBitmap()
     117        {
     118            return bmp;
     119        }
     120    private:
     121        WTL::CBitmap bmp;
     122        HBITMAP hbmpOld;
     123    };
     124
     125    LRESULT OnDwmSendIconicThumnail(UINT, WPARAM, LPARAM lp)
     126    {
     127        HRESULT hr = SetIconicThumbnail(HIWORD(lp), LOWORD(lp));
     128        return 0;
     129    }
     130
     131    LRESULT OnDwmSendIconicLivePreviewBitmap(UINT, WPARAM, LPARAM)
     132    {
     133        HRESULT hr = SetIconicLivePreviewBitmap();
     134        return 0;
     135    }
     136
     137    HRESULT SetIconicThumbnail(int maximumWidth, int maximumHeight)
     138    {
     139        int widthBmp, heightBmp;
     140        BitmapMemoryDC dcSrc(CreateBitmap(widthBmp, heightBmp));
     141        if (dcSrc)
     142        {
     143            int width, height;  // dcSrcの縦横比に合わせて縮小する
     144            if (widthBmp * maximumHeight > maximumWidth * heightBmp) // (widthBmp / heightBmp > maximumWidth / maximumHeight)
     145            {
     146                width = maximumWidth;
     147                height = heightBmp * maximumWidth / widthBmp;
     148            }
     149            else
     150            {
     151                height = maximumHeight;
     152                width = widthBmp * maximumHeight / heightBmp;
     153            }
     154            void* pvBits;
     155            BitmapMemoryDC dc(width, height, pvBits);
     156            if (dc)
     157            {
     158                StretchBlt(dc, 0, 0, width, height, dcSrc, 0, 0, widthBmp, heightBmp, SRCCOPY);
     159                return DwmSetIconicThumbnail(*this, dc.GetBitmap(), DWM_SIT_DISPLAYFRAME);
     160            }
     161        }
     162        return HRESULT_FROM_WIN32(GetLastError());
     163    }
     164
     165    HRESULT SetIconicLivePreviewBitmap()
     166    {
     167        int w, h;
     168        WTL::CBitmap bmp(CreateBitmap(w, h));
     169        if (bmp)
     170        {
     171            POINT pt = {};
     172            wndTarget.MapWindowPoints(hOwner, &pt, 1);
     173            pt.y += GetSystemMetrics(SM_CYMENU);
     174            return DwmSetIconicLivePreviewBitmap(*this, bmp, &pt, wndTarget.IsZoomed() ? 0 : DWM_SIT_DISPLAYFRAME);
     175        }
     176        return HRESULT_FROM_WIN32(GetLastError());
     177    }
     178
     179    static void SetAlpha(DWORD& pixel)
     180    {
     181        pixel |= 0xff000000;
     182    }
     183
     184    HBITMAP CreateBitmap(int& width, int& height)
     185    {
     186        RECT rcClient;
     187        wndTarget.GetClientRect(&rcClient);
     188        void* pvBits;
     189        BitmapMemoryDC dc(rcClient.right, rcClient.bottom, pvBits);
     190        if (dc)
     191        {
     192            int wndNum = GetWndNum(wndTarget);
     193            if (wndNum != -1)
     194            {
     195                CPoint origin(0, 0);
     196                wndTarget.ClientToScreen( &origin );
     197                CRect rcWindow;
     198                wndTarget.GetWindowRect( rcWindow );
     199                origin -= rcWindow.TopLeft();
     200                dc.SetWindowOrg( origin ); // クライアント領域の(0, 0)がビットマップの(0, 0)になるよう合わせる
     201                wndTarget.Print( dc, PRF_CHECKVISIBLE | PRF_ERASEBKGND | PRF_CHILDREN | PRF_CLIENT );
     202                width = rcClient.right;
     203                height = rcClient.bottom;
     204                DWORD* pdwBits = static_cast<DWORD*>(pvBits);
     205                std::for_each(pdwBits, pdwBits + width * height, SetAlpha);
     206                return dc.GetBitmap().Detach();
     207            }
     208        }
     209        return 0;
     210    }
     211    // 32ビットトップダウンのDIBセクションを作る補助
     212    static HBITMAP CreateDIBSection32(HDC hdc, int width, int height, void*& pb)
     213    {
     214        BITMAPINFO bi;
     215        ZeroMemory(&bi.bmiHeader, sizeof bi.bmiHeader);
     216        bi.bmiHeader.biSize = sizeof bi.bmiHeader;
     217        bi.bmiHeader.biWidth = width;
     218        bi.bmiHeader.biHeight = -height;  // トップダウンDIBにする必要があるらしい
     219        bi.bmiHeader.biPlanes = 1;
     220        bi.bmiHeader.biBitCount = 32;
     221        return CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &pb, 0, 0);
     222    }
     223
     224    CWindow wndTarget;
     225};
     226
     227class TaskbarList
     228{
     229    typedef boost::shared_ptr<DummyWindowForTaskbarButton> DummyWindowForTaskbarButtonPtr;
     230    typedef std::map<HWND, DummyWindowForTaskbarButtonPtr> WindowMap;
     231public:
     232    TaskbarList(HWND hwndFrame) :
     233        wndFrame(hwndFrame)
     234    {
     235        HRESULT hr = taskbarList.CoCreateInstance( CLSID_TaskbarList );
     236        if ( FAILED( hr ) ) {
     237            return;
     238        }
     239        HRESULT hr2 = taskbarList->HrInit();
     240        if ( FAILED( hr2 ) ) {
     241            taskbarList.Release();
     242            return;
     243        }
     244    }
     245
     246    void RegisterTab(HWND hwndChild, const char* title)
     247    {
     248        assert( hwndChild );
     249        if (taskbarList)
     250        {
     251            assert( windowMap.find(hwndChild) == windowMap.end() );
     252            DummyWindowForTaskbarButtonPtr p(new DummyWindowForTaskbarButton(hwndChild, title));
     253            windowMap.insert(std::make_pair(hwndChild, p));
     254            //タスクバーボタンに追加
     255            HRESULT hr = taskbarList->RegisterTab(*p, wndFrame);
     256        }
     257    }
     258
     259    void RegisterTab(HWND hwndChild)
     260    {
     261        ATL::CWindow wnd = hwndChild;
     262        ATL::CString title;
     263        wnd.GetWindowText(title);
     264        RegisterTab(hwndChild, title);
     265    }
     266
     267    void UnregisterTab(HWND hwndChild)
     268    {
     269        if (taskbarList)
     270        {
     271            WindowMap::iterator it = windowMap.find(hwndChild);
     272            assert( it != windowMap.end() );
     273            HRESULT hr = taskbarList->UnregisterTab(*it->second);
     274            it->second->DestroyWindow();
     275            windowMap.erase( it );
     276        }
     277    }
     278
     279    void InvalidateIconicBitmaps(HWND hwndChild)
     280    {
     281        DwmInvalidateIconicBitmaps(*mapAt(hwndChild));
     282    }
     283
     284    void SetTabActivate(HWND hwndChild)
     285    {
     286        if (taskbarList)
     287        {
     288            taskbarList->SetTabActive(*mapAt(hwndChild), wndFrame, 0);
     289        }
     290    }
     291
     292    void SetTabOrder( HWND hwndChild, HWND hwndInsertBefore )
     293    {
     294        if (taskbarList)
     295        {
     296        taskbarList->SetTabOrder(*mapAt(hwndChild),
     297            hwndInsertBefore
     298            ? static_cast<HWND>(*mapAt(hwndInsertBefore))
     299            : 0);
     300        }
     301    }
     302private:
     303    DummyWindowForTaskbarButtonPtr mapAt(HWND hwndChild)
     304    {
     305        DummyWindowForTaskbarButtonPtr p = windowMap[hwndChild];
     306        assert(p);
     307        return p;
     308    }
     309    CWindow wndFrame;
     310    ATL::CComPtr<ITaskbarList3> taskbarList;
     311    WindowMap windowMap;
     312};
     313#endif HAVE_WINDOWS_7_SDK
     314
     315#ifdef HAVE_WINDOWS_7_SDK
     316MainFrame::MainFrame() :
     317    TaskbarButtonCreated( RegisterWindowMessage( TEXT("TaskbarButtonCreated") ) )
     318{
     319    if ( TaskbarButtonCreated != 0 )
     320    {
     321        typedef BOOL WINAPI CWMF(UINT, DWORD);
     322        HMODULE hmodUser = GetModuleHandle( TEXT("user32.dll") );
     323        assert( hmodUser != 0 );
     324        if ( CWMF* pcwmf = reinterpret_cast<CWMF*>( GetProcAddress( hmodUser, "ChangeWindowMessageFilter" ) ) )
     325        {
     326            pcwmf(TaskbarButtonCreated, MSGFLT_ADD);
     327            pcwmf(WM_DWMSENDICONICTHUMBNAIL, MSGFLT_ADD);
     328            pcwmf(WM_DWMSENDICONICLIVEPREVIEWBITMAP, MSGFLT_ADD);
     329        }
     330    }
     331}
     332#else
     333MainFrame::MainFrame() {}
     334#endif
    30335
    31336void MainFrame::Resized()
     
    59364    //Status bar
    60365    int height_Statusbar;
    61     SendMessage(hStatusBar,SB_GETRECT,0,(long)&StatusRect);
     366    SendMessage(hStatusBar,SB_GETRECT,0,(LPARAM)&StatusRect);
    62367    height_Statusbar=StatusRect.bottom;
    63368
     
    227532    hOwner = m_hWnd;
    228533    extern WNDPROC oldMainFrameWndProc;
    229     oldMainFrameWndProc = (WNDPROC)::GetWindowLong( hOwner, GWL_WNDPROC );
    230     ::SetWindowLongPtr( hOwner, GWL_WNDPROC, reinterpret_cast<LONG_PTR>(WindowFunc) );
     534    oldMainFrameWndProc = (WNDPROC)::SetWindowLongPtr( hOwner, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(WindowFunc) );
    231535
    232536    SetupWindow(hOwner);
     
    234538    //テキストエディタフォント設定
    235539    ResetTextEditFont(hOwner);
    236 
    237 
    238540
    239541    return 0;
     
    549851void MainFrame::OnPaint( HDC )
    550852{
    551     PAINTSTRUCT ps;
    552     HDC hdc = this->BeginPaint( &ps );
    553 
    554     HBRUSH hBrush = CreateSolidBrush( GetSysColor( COLOR_3DFACE ) );
     853    WTL::CPaintDC dc( m_hWnd );
    555854
    556855    RECT rect;
    557856    this->GetClientRect( &rect );
    558857
    559     FillRect( hdc, &rect, hBrush );
    560 
    561     DeleteObject( hBrush );
    562 
    563     this->EndPaint( &ps );
     858    dc.FillRect( &rect, GetSysColorBrush( COLOR_3DFACE ) );
    564859}
    565860
     
    600895    ::UpdateWindow(hChild);
    601896
    602     char *pTemp=MdiInfo[WndNum]->pMdiTextEdit->buffer;
     897    const char *pTemp=MdiInfo[WndNum]->pMdiTextEdit->buffer;
    603898
    604899    //行の先頭インデックスを取得(取得する行の番号はwParamで渡される)
     
    628923}
    629924
     925::LRESULT MainFrame::OnTaskbarButtonCreated( ::UINT msg, ::WPARAM, ::LPARAM )
     926{
     927#ifdef HAVE_WINDOWS_7_SDK
     928    if ( msg == 0 ) { // 念のため確認
     929        return 0;
     930    }
     931    taskbarList.reset(new TaskbarList(*this));
     932#endif
     933    return 0;
     934}
     935
     936void MainFrame::AddChildWindow( HWND hwndChild )
     937{
     938#ifdef HAVE_WINDOWS_7_SDK
     939    taskbarList->RegisterTab( hwndChild );
     940#endif
     941}
     942
     943void MainFrame::DeleteChildWindow( HWND hwndChild )
     944{
     945#ifdef HAVE_WINDOWS_7_SDK
     946    taskbarList->UnregisterTab( hwndChild );
     947#endif
     948}
     949
     950void MainFrame::ActivateChildWindow( HWND hwndChild )
     951{
     952#ifdef HAVE_WINDOWS_7_SDK
     953    taskbarList->SetTabActivate( hwndChild );
     954#endif
     955}
     956
     957void MainFrame::SetTabOrder( HWND hwndChild, HWND hwndInsertBefore )
     958{
     959#ifdef HAVE_WINDOWS_7_SDK
     960    taskbarList->SetTabOrder( hwndChild, hwndInsertBefore );
     961#endif
     962}
     963
     964void MainFrame::InvalidateBitmap( HWND hwndChild )
     965{
     966#ifdef HAVE_WINDOWS_7_SDK
     967    taskbarList->InvalidateIconicBitmaps( hwndChild );
     968#endif
     969}
     970
    630971void MainFrame::OnCmdNew( UINT uNotifyCode, int nID, CWindow wndCtl )
    631972{
     
    639980    char temporary[MAX_PATH];
    640981
    641     FileType=DialogBox(hResInst,MAKEINTRESOURCE(IDD_NEWFILE),hOwner,(DLGPROC)DlgNewFile);
     982    FileType=DialogBox(hResInst,MAKEINTRESOURCE(IDD_NEWFILE),hOwner,DlgNewFile);
    642983    if(FileType==-1) return;
    643984
     
    7451086{
    7461087    //文字コードを指定して保存
    747     DialogBox(hResInst,MAKEINTRESOURCE(IDD_CODE_SAVE),m_hWnd,(DLGPROC)nkfDlgCodeSave);
     1088    DialogBox(hResInst,MAKEINTRESOURCE(IDD_CODE_SAVE),m_hWnd,nkfDlgCodeSave);
    7481089}
    7491090
    7501091void MainFrame::OnCmdAllSave( UINT uNotifyCode, int nID, CWindow wndCtl )
    7511092{
    752     for( int i=0;i<MdiInfo.size();i++){
    753         if(MdiInfo[i]->hwnd) SaveDocument(MdiInfo[i]->hwnd,NULL);
     1093    foreach( MDIINFO *mi, MdiInfo ){
     1094        if(mi->hwnd) SaveDocument(mi->hwnd,NULL);
    7541095    }
    7551096    if( projectInfo.IsOpened() )
     
    8241165        TextEdit_GetSel(WndNum,&CharRange);
    8251166
    826         HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
     1167        HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
    8271168        char *pTemp=(char *)GlobalLock(hGlobal);
    8281169        memcpy(pTemp,MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
     
    8851226        TextEdit_GetSel(WndNum,&CharRange);
    8861227
    887         HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
     1228        HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
    8881229        char *pTemp=(char *)GlobalLock(hGlobal);
    8891230        memcpy(pTemp,MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
     
    10301371void MainFrame::OnCmdFind( UINT uNotifyCode, int nID, CWindow wndCtl )
    10311372{
    1032     DialogBox(hResInst,MAKEINTRESOURCE(IDD_FIND),m_hWnd,(DLGPROC)DlgFind);
     1373    DialogBox(hResInst,MAKEINTRESOURCE(IDD_FIND),m_hWnd,DlgFind);
    10331374}
    10341375
    10351376void MainFrame::OnCmdPermutation( UINT uNotifyCode, int nID, CWindow wndCtl )
    10361377{
    1037     DialogBox(hResInst,MAKEINTRESOURCE(IDD_PERMUTATION),m_hWnd,(DLGPROC)DlgPermutation);
     1378    DialogBox(hResInst,MAKEINTRESOURCE(IDD_PERMUTATION),m_hWnd,DlgPermutation);
    10381379}
    10391380
     
    10461387void MainFrame::OnCmdStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
    10471388{
    1048     DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,0);
     1389    DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,DlgStringCount,0);
    10491390}
    10501391
    10511392void MainFrame::OnCmdSelStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
    10521393{
    1053     DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,1);
     1394    DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,DlgStringCount,1);
    10541395}
    10551396#endif
     
    12901631    int idProcess;
    12911632    DWORD dwPlatform;
    1292     idProcess=DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_ATTACH),m_hWnd,(DLGPROC)DlgAttach,(LPARAM)&dwPlatform);
     1633    idProcess=DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_ATTACH),m_hWnd,DlgAttach,(LPARAM)&dwPlatform);
    12931634    if(idProcess==0) return;
    12941635
     
    15521893void MainFrame::OnCmdAbout( UINT uNotifyCode, int nID, CWindow wndCtl )
    15531894{
    1554     DialogBox(hResInst,MAKEINTRESOURCE(IDD_ABOUT),m_hWnd,(DLGPROC)DialogAbout);
     1895    DialogBox(hResInst,MAKEINTRESOURCE(IDD_ABOUT),m_hWnd,DialogAbout);
    15551896}
    15561897
     
    16111952    //このウィンドウ以外をすべて閉じる(&A)
    16121953    HWND hChild=::GetWindow(hClient,GW_CHILD);
    1613     int WndNum=GetWndNum(hChild);
    1614     for(int i=0;i<MdiInfo.size();i++){
    1615         if(i==WndNum) continue;
    1616         if(MdiInfo[i]->hwnd) SendMessage(MdiInfo[i]->hwnd,WM_CLOSE,0,0);
     1954    foreach ( MDIINFO *mi, MdiInfo ){
     1955        if ( mi->hwnd == hChild ){
     1956            continue;
     1957        }
     1958        if(mi->hwnd){
     1959            ::PostMessage( mi->hwnd, WM_CLOSE, 0, 0 );
     1960            //foreachの最中に削除されるとイテレータが回らないのでSendを使っていない。
     1961        }
    16171962    }
    16181963}
  • trunk/ab5.0/abdev/abdev/src/Program.cpp

    r719 r772  
    1717    // メインフレームを作成
    1818    mainFrame.Create(
    19         HWND_DESKTOP,
     19        0,
    2020        pobj_nv->StartupWindowRect,
    2121        APPLICATION_NAME,
     
    3232}
    3333
    34 void Program::Main()
     34void Program::Main(HINSTANCE hinst)
    3535{
    36     _Module.Init( NULL, GetModuleHandle( NULL ) );
     36    _Module.Init( NULL, hinst );
    3737
    3838    CMessageLoop loop;
  • trunk/ab5.0/abdev/abdev/stdafx.h

    r681 r772  
    11#pragma once
     2#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
    23
    34#include <map>
     
    89
    910#include <windows.h>
     11#include <windowsx.h>
    1012#include <stdio.h>
    1113#include <string.h>
     
    1820#include <fcntl.h>
    1921#include <io.h>
     22#include <assert.h>
    2023
    2124#include <atlbase.h>
     25#include <atlstr.h>
    2226#include <atlcom.h>
    2327#include <atlhost.h>
     
    6468
    6569#include <ProjectManager/ProjectManager.h>
     70
Note: See TracChangeset for help on using the changeset viewer.