/*! ノーティファイメッセージの処理 @param[in] hWnd 親ウインドウのハンドル @param[in] idFrom NOTIFYを発生させたコントロールのID @param[in] pstNmhdr NOTIFYの詳細 @return 処理した内容とか */ LRESULT Drt_OnNotify( HWND hWnd, INT idFrom, LPNMHDR pstNmhdr ) { INT iTarget, iOffset, i; INT_PTR iItems; LPSTR pcConts = NULL; POINT stMosPos; LPNMTTDISPINFO pstDispInfo; MAAM_ITR itItem; if( TTN_GETDISPINFO == pstNmhdr->code ) // ツールチップの内容の問い合わせだったら { GetCursorPos( &stMosPos ); // スクリーン座標 ScreenToClient( hWnd, &stMosPos ); // クライヤント座標に変換 pstDispInfo = (LPNMTTDISPINFO)pstNmhdr; ZeroMemory( &(pstDispInfo->szText), sizeof(pstDispInfo->szText) ); pstDispInfo->lpszText = NULL; if( !(gbAAtipView) ){ return 0; } // 非表示なら何もしないでおk FREE( gptTipBuffer ); iTarget = DraughtTargetItemSet( &stMosPos ); TRACE( TEXT("TARGET %d"), iTarget ); if( gbThumb ) // サムネイル { iOffset = gdVwTop * TPNL_HORIZ; iTarget = iOffset + iTarget; pcConts = AacAsciiArtGet( iTarget ); // 該当するインデックスAAを引っ張ってくる gptTipBuffer = SjisDecodeAlloc( pcConts ); FREE( pcConts ); } else { iItems = gvcDrtItems.size( ); // 現在個数 if( iItems > iTarget ) // 保持数内であれば { for( i = 0, itItem = gvcDrtItems.begin(); gvcDrtItems.end() != itItem; i++, itItem++ ) { if( iTarget == i ) // ヒット { gptTipBuffer = SjisDecodeAlloc( itItem->pcItem ); break; } } } } // ここでNULLを返すと、それ以降のチップが出てこない if( gptTipBuffer ){ pstDispInfo->lpszText = gptTipBuffer; } else{ pstDispInfo->lpszText = TTMSG_NO_ITEM; } } return 0; }
/*! HoverTip用のコールバック受取 @param[in] pVoid 未定義 @return 確保した文字列・もしくはNULL */ LPTSTR CALLBACK DraughtHoverTipInfo( LPVOID pVoid ) { INT iTarget, iOffset, i; INT_PTR iItems; LPSTR pcConts = NULL; LPTSTR ptBuffer = NULL; MAAM_ITR itItem; if( !(gbAAtipView) ){ return NULL; } // 非表示なら何もしないでおk if( 0 > giItemSel ){ return NULL; } if( gbThumb ) // サムネイル { iOffset = gdVwTop * TPNL_HORIZ; iTarget = iOffset + giItemSel; pcConts = AacAsciiArtGet( iTarget ); // 該当するインデックスAAを引っ張ってくる ptBuffer = SjisDecodeAlloc( pcConts ); FREE( pcConts ); } else { iTarget = giItemSel; iItems = gvcDrtItems.size( ); // 現在個数 if( iItems > iTarget ) // 保持数内であれば { for( i = 0, itItem = gvcDrtItems.begin(); gvcDrtItems.end() != itItem; i++, itItem++ ) { if( iTarget == i ) // ヒット { ptBuffer = SjisDecodeAlloc( itItem->pcItem ); break; } } } } return ptBuffer; }
/*! AAのサムネ用イメージを作る @param[in] hWnd ウインドウハンドル @param[in,out] pstItem イメージ作りたいAAのデータとか */ UINT DraughtAaImageing( HWND hWnd, LPAAMATRIX pstItem ) { UINT_PTR cchSize; LPTSTR ptTextaa; INT iRslt, iYdot, iXdot, iLine; HDC hdc, hMemDC; HBITMAP hOldBmp; RECT rect; ptTextaa = SjisDecodeAlloc( pstItem->pcItem ); StringCchLength( ptTextaa, STRSAFE_MAX_CCH, &cchSize ); // 元AAのサイズ確定が必要 iXdot = TextViewSizeGet( ptTextaa, &iLine ); iYdot = iLine * LINE_HEIGHT; pstItem->iMaxDot = iXdot; pstItem->iLines = iLine; if( giItemWidth > iXdot ) iXdot = giItemWidth; if( giItemHeight > iYdot ) iYdot = giItemHeight; pstItem->stSize.cx = iXdot; pstItem->stSize.cy = iYdot; SetRect( &rect, 0, 0, iXdot, iYdot ); // あんまり大きいなら、左上限定とか? // 描画用ビットマップ作成 hdc = GetDC( hWnd ); // サムネ用BMP・これはフルサイズ // pstItem->hThumbDC pstItem->hOldBmp hMemDC = CreateCompatibleDC( hdc ); pstItem->hThumbBmp = CreateCompatibleBitmap( hdc, rect.right, rect.bottom ); hOldBmp = SelectBitmap( hMemDC, pstItem->hThumbBmp ); SelectFont( hMemDC, ghAaFont ); ReleaseDC( ghDraughtWnd, hdc ); iRslt = PatBlt( hMemDC, 0, 0, rect.right, rect.bottom, WHITENESS ); iRslt = DrawText( hMemDC, ptTextaa, cchSize, &rect, DT_LEFT | DT_NOPREFIX | DT_NOCLIP | DT_WORDBREAK ); SelectFont( hMemDC, GetStockFont(DEFAULT_GUI_FONT) ); SelectBitmap( hMemDC, hOldBmp ); DeleteDC( hMemDC ); FREE( ptTextaa ); return 0; }
/*! 見出しコンボックスに内容追加 @param[in] number 通し番号 @param[in] pcTitle 入れ込む文字列 @return 継ぎ足したあとの項目数 */ INT AaTitleAddString( UINT number, LPSTR pcTitle ) { AATITLE stTitle; LPTSTR ptTitle; ptTitle = SjisDecodeAlloc( pcTitle ); ComboBox_AddString( ghComboxWnd, ptTitle ); ZeroMemory( &stTitle, sizeof(AATITLE) ); stTitle.number = number; StringCchCopy( stTitle.atTitle, MAX_STRING, ptTitle ); gvcAaTitle.push_back( stTitle ); FREE(ptTitle); return ComboBox_GetCount( ghComboxWnd ); }
/*! 指定の頁を、指定条件を受けて検索する @param[in] hWnd ウインドウハンドル @param[in] ptFindText 検索したい文字列 @param[in] iTargetPage 検索頁 @return UINT 非0その頁に文字列があった 0なかった */ UINT AacItemFindOnePage( HWND hWnd, LPTSTR ptFindText, INT iTargetPage ) { LPSTR pcItem; LPTSTR ptTarget, ptFindPos; INT iMoziPos; UINT dFound = FALSE; // 中身もってくる pcItem = AacAsciiArtGet( iTargetPage ); // ユニコードに直して比較する ptTarget = SjisDecodeAlloc( pcItem ); FREE( pcItem ); ptFindPos = FindStringProc( ptTarget, ptFindText, &iMoziPos ); // Viewer側 if( ptFindPos ){ dFound = TRUE; } // 存在してるか? FREE( ptTarget ); return dFound; }
/*! HoverTip用のコールバック受取 @param[in] pVoid 未定義 @return 確保した文字列・もしくはNULL */ LPTSTR CALLBACK AaItemsHoverTipInfo( LPVOID pVoid ) { UINT_PTR rdLength; LPSTR pcConts = NULL; LPTSTR ptBuffer = NULL; if( !(gbAAtipView) ){ return NULL; } // 非表示なら何もしないでおk if( 0 > gixNowToolTip ){ return NULL; } pcConts = AacAsciiArtGet( gixNowToolTip ); // 該当するインデックスのAAを引っ張ってくる if( !pcConts ){ return 0; } ptBuffer = SjisDecodeAlloc( pcConts ); rdLength = lstrlen( ptBuffer ); // 文字列の長さ取得 free( pcConts ); TRACE( TEXT("MAA HOVER CALL %d, by[%d]"), gixNowToolTip, rdLength ); return ptBuffer; }
/*! MAAからSJISを受け取って処理する・Editor側にもある @param[in] hWnd ウインドウハンドル @param[in] pcCont AAの文字列 @param[in] cbSize バイト数・末端NULLは含まない @param[in] dMode 使用モード・デフォもしくは個別指定 @return 非0デフォ動作した 0指定モードだった */ UINT ViewMaaMaterialise( HWND hWnd, LPSTR pcCont, UINT cbSize, UINT dMode ) { LPTSTR ptString; UINT_PTR cchSize; UINT uRslt = TRUE; // デフォ動作であるならTRUE<いつでもTRUEにした // FLASHWINFO stFshWInfo; // デフォ動作であるかどうか // if( dMode == gdUseMode ){ uRslt = TRUE; } if( MAA_DEFAULT == dMode ){ dMode = gdUseMode; } if( MAA_SUBDEFAULT== dMode ){ dMode = gdUseSubMode; } if( MAA_UNICLIP == dMode ) // ユニコード { ptString = SjisDecodeAlloc( pcCont ); // ユニコードにしておく StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize ); // ユニコード的にクリッペ DocClipboardDataSet( ptString, (cchSize + 1) * 2, D_UNI ); FREE(ptString); } else if( MAA_DRAUGHT == dMode ){ DraughtItemAdding( hWnd, pcCont ); } // ドラフトボードに追加 else{ DocClipboardDataSet( pcCont, (cbSize + 1), D_SJIS ); } // SJISコピー //ZeroMemory( &stFshWInfo, sizeof(FLASHWINFO) ); //stFshWInfo.cbSize = sizeof(FLASHWINFO); // この構造体のサイズ //stFshWInfo.hwnd = ghMaaWnd; // wktkさせたいウインダウのハンドル //stFshWInfo.dwFlags = FLASHW_ALL; // キャプションとタスクバーのボタン両方 //stFshWInfo.uCount = 2; // wktkさせる回数 //stFshWInfo.dwTimeout = 0; // 間隔。0でデフォルト的な間隔 //FlashWindowEx( &stFshWInfo ); // wktkさせる return uRslt; }
/*! ノーティファイメッセージの処理 @param[in] hWnd ウインドウハンドル @param[in] idFrom NOTIFYを発生させたコントロールのID @param[in] pstNmhdr NOTIFYの詳細 @return 処理した内容とか */ LRESULT Aai_OnNotify( HWND hWnd, INT idFrom, LPNMHDR pstNmhdr ) { UINT_PTR rdLength; LPSTR pcConts = NULL; LPNMTTDISPINFO pstDispInfo; if( TTN_GETDISPINFO == pstNmhdr->code ) // ツールチップの内容の問い合わせだったら { pstDispInfo = (LPNMTTDISPINFO)pstNmhdr; if( !(gbAAtipView) ) // 非表示なら何もしないでおk { ZeroMemory( &(pstDispInfo->szText), sizeof(pstDispInfo->szText) ); pstDispInfo->lpszText = NULL; return 0; } FREE( gptTipBuffer ); pcConts = AacAsciiArtGet( gixNowSel ); // 該当するインデックスAAを引っ張ってくる if( !pcConts ){ return 0; } rdLength = strlen( pcConts ); // 文字列の長さ取得 //gptTipBuffer = (LPTSTR)malloc( sizeof(TCHAR) * (rdLength+1) ); //ZeroMemory( gptTipBuffer, sizeof(TCHAR) * (rdLength+1) ); //MultiByteToWideChar( CP_ACP, MB_COMPOSITE, pcConts, -1, gptTipBuffer, (rdLength+1) ); gptTipBuffer = SjisDecodeAlloc( pcConts ); pstDispInfo->lpszText = gptTipBuffer; free( pcConts ); } return 0; }
/*! クリップボードのデータをいただく・同じモノが、DocInsDelCtrl.cpp にある @param[in] pVoid 特になし @return 確保した文字列・mallocしてるので、函数呼んだ方でfree忘れないように */ LPTSTR ClipboardDataGet( LPVOID pVoid ) { LPTSTR ptString = NULL, ptClipTxt; LPSTR pcStr, pcClipTp; // 変換用臨時 DWORD cbSize; UINT dEnumFmt; INT ixCount, iC; HANDLE hClipData; // クリップボードの中身をチェキ・どっちにしてもユニコードテキストフラグはある if( IsClipboardFormatAvailable( CF_UNICODETEXT ) ) { OpenClipboard( NULL ); // クリップボードをオーポンする // 開けっ放しだと他のアプリに迷惑なのですぐ閉めるように dEnumFmt = 0; // 初期値は0 ixCount = CountClipboardFormats( ); for( iC = 0; ixCount > iC; iC++ ) { // 順番に列挙して、先にヒットしたフォーマットで扱う dEnumFmt = EnumClipboardFormats( dEnumFmt ); if( CF_UNICODETEXT == dEnumFmt || CF_TEXT == dEnumFmt ){ break; } } if( 0 == dEnumFmt ){ return NULL; } // それ以上列挙が無いか、函数失敗なら0になる // クリップボードのデータをゲッツ! // ハンドルのオーナーはクリップボードなので、こちらからは操作しないように // 中身の変更などもってのほかである hClipData = GetClipboardData( dEnumFmt ); if( CF_UNICODETEXT == dEnumFmt ) { // 取得データを処理。TEXTなら、ハンドルはグローバルメモリハンドル // 新たにコピーされたらハンドルは無効になるので、中身をコピーせよ ptClipTxt = (LPTSTR)GlobalLock( hClipData ); cbSize = GlobalSize( (HGLOBAL)hClipData ); // 確保出来るのはバイトサイズ・テキストだと末尾のNULLターミネータ含む if( 0 < cbSize ) { ptString = (LPTSTR)malloc( cbSize ); StringCchCopy( ptString, (cbSize / 2), ptClipTxt ); } } else // 非ユニコードが優先されている場合 { pcClipTp = (LPSTR)GlobalLock( hClipData ); cbSize = GlobalSize( (HGLOBAL)hClipData ); if( 0 < cbSize ) { pcStr = (LPSTR)malloc( cbSize ); StringCchCopyA( pcStr, cbSize, pcClipTp ); ptString = SjisDecodeAlloc( pcStr ); // SJISの内容をユニコードにする free( pcStr ); } } // 使い終わったら閉じておく GlobalUnlock( hClipData ); CloseClipboard( ); } return ptString; }
/*! ファイルを確保 @param[in] ptFileName 指定されたファイル名で開く @return LPARAM 0失敗 1〜成功 */ LPARAM DocFileInflate( LPTSTR ptFileName ) { CONST WCHAR rtHead = 0xFEFF; // ユニコードテキストヘッダ WCHAR rtUniBuf; HANDLE hFile; DWORD readed; LPVOID pBuffer; // 文字列バッファ用ポインター INT iByteSize; LPTSTR ptString; LPSTR pcText; UINT_PTR cchSize; LPARAM dNumber; #ifdef BIG_TEXT_SEPARATE // 頁区切りのないTXTかどうかを確認する UINT dSepRslt; LPTSTR ptSepBuff; #endif #ifdef _DEBUG DWORD dTcStart, dTcEnd; #endif //TCHAR atBuff[10]; //ZeroMemory( atBuff, sizeof(atBuff) ); #ifdef _DEBUG dTcStart = GetTickCount( ); #endif assert( ptFileName ); // ファイル開けないのはバグ // ファイル名が空っぽだったら自動的にアウツ! if( NULL == ptFileName[0] ){ return 0; } // レッツオーポン hFile = CreateFile( ptFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( INVALID_HANDLE_VALUE == hFile ){ return 0; } //InitLastOpen( INIT_SAVE, ptFileName ); // 複数ファイルでは意味が無い // 処理順番入替 iByteSize = GetFileSize( hFile, NULL ); pBuffer = malloc( iByteSize + 4 ); // バッファは少し大きめに取る ZeroMemory( pBuffer, iByteSize + 4 ); SetFilePointer( hFile, 0, NULL, FILE_BEGIN ); ReadFile( hFile, pBuffer, iByteSize, &readed, NULL ); CloseHandle( hFile ); // 内容全部取り込んだから開放 // ユニコードチェック CopyMemory( &rtUniBuf, pBuffer, 2 ); if( rtHead == rtUniBuf ) // ユニコードヘッダがあれば { ptString = (LPTSTR)pBuffer; ptString++; // ユニコードヘッダ分進めておく } else { pcText = (LPSTR)pBuffer; // シフトJISを開く場合、�の部分をどうにかせんといかん ptString = SjisDecodeAlloc( pcText ); // ファイルを開くとき FREE( pBuffer ); // こっちで開放 pBuffer = ptString; // ポイントするところを変更 } StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize ); #ifdef BIG_TEXT_SEPARATE // 頁区切りのないTXTかどうかを確認する dSepRslt = DocFileHugeCheck( ptString, cchSize ); if( 1 == dSepRslt ) // 分割処理する { ptSepBuff = DocFileHugeSeparate( ptString, cchSize ); if( !(ptSepBuff) ){ return 0; } // なんかミスってるなら中止 FREE( pBuffer ); // 大本を一旦開放 pBuffer = ptSepBuff; // 最後に開放する領域としてポイントするところを変更 ptString = ptSepBuff; // 読込処理を続ける位置としてセット StringCchLength( ptString, STRSAFE_MAX_CCH , &cchSize ); // サイズ読込直し } else if( 2 == dSepRslt ) // 読込中止 { FREE( pBuffer ); // 大本を開放 return 0; } // 0なら何もしない #endif // 新しいファイル置き場の準備 2014/05/28↑にあったのを移動した dNumber = DocMultiFileCreate( NULL ); // 実際のファイルを開くとき if( 0 >= dNumber ) return 0; StringCchCopy( (*gitFileIt).atFileName, MAX_PATH, ptFileName ); // もしASTなら、先頭は[AA]になってるはず・分割は中でやる if( StrCmpN( AST_SEPARATERW, ptString, 4 ) ) { DocStringSplitMLT( ptString , cchSize, DocPageLoad ); } else { DocStringSplitAST( ptString , cchSize, DocPageLoad ); } // ファイル開いたらキャレットとかスクロールをリセットする ViewEditReset( ); FREE( pBuffer ); // =ptString DocPageChange( 0 ); // 全部読み込んだので最初のページを表示する PageListViewChange( -1, -1 ); // 直前頁リセット AppTitleChange( ptFileName ); #ifdef _DEBUG dTcEnd = GetTickCount( ); TRACE( TEXT("LOAD START[%u] END[%u] ELAPSE[%u]"), dTcStart, dTcEnd, (dTcEnd - dTcStart) ); #endif return dNumber; }
/*! ASDなSJIS文字列を受け取って分解しつつページに入れる @param[in] pcStr 分解対象SJIS文字列へのポインター @param[in] cbSize その文字列の文字数 @param[in] pfPageLoad 内容を入れるコールバック函数のアレ @return UINT 作成した頁数 */ UINT DocImportSplitASD( LPSTR pcStr, INT cbSize, PAGELOAD pfPageLoad ) { //ASDなら、SJISのままで0x01,0x01、0x02,0x02を対応する必要がある //0x01,0x01が改行、0x02,0x02が説明の区切り、アイテム区切りが改行 LPSTR pcCaret; // 読込開始・現在位置 LPSTR pcEnd, pcDesc; UINT iNumber; // 通し番号カウント UINT cbItem, d; BOOLEAN bLast; LPTSTR ptName, ptCont; UINT_PTR cchItem; pcCaret = pcStr; // まずは最初から iNumber = 0; // 通し番号0インデックス bLast = FALSE; do // とりやえず実行 { pcEnd = NextLineA( pcCaret ); // 次の行までで1アイテム //if( !(*pcEnd) ) // 見つからなかったら=これが最後なら=NULL //{ // pcEnd = pcStr + cbSize; // CHARサイズで計算おk? // bLast = TRUE; //} // 中身がNULLなだけで、ポインタは有効なので特に位置計算は不要か cbItem = pcEnd - pcCaret; // 壱行の文字数 pcDesc = NULL; ptName = NULL; ptCont = NULL; for( d = 0; cbItem > d; d++ ) { if( (0x0D == pcCaret[d]) && (0x0A == pcCaret[d+1]) ) // 末端であるか { pcCaret[d] = 0x00; // 末端なのでNULLにする pcCaret[d+1] = 0x00; if( pcDesc ){ ptName = SjisDecodeAlloc( pcDesc ); } break; } // 処理順番注意 if( (0x01 == pcCaret[d]) && (0x01 == pcCaret[d+1]) ) // 改行であるか { pcCaret[d] = 0x0D; // ¥r pcCaret[d+1] = 0x0A; // ¥n d++; // 変換したので次に進めるのがよい } if( (0x02 == pcCaret[d]) && (0x02 == pcCaret[d+1]) ) // アイテムと説明の区切り { pcDesc = &(pcCaret[d+2]); // 説明開始位置 pcCaret[d] = 0x00; // 仕切りなのでNULLにする pcCaret[d+1] = 0x00; d++; // 変換したので次に進めるのがよい } } ptCont = SjisDecodeAlloc( pcCaret ); // 作っておく StringCchLength( ptCont, STRSAFE_MAX_CCH, &cchItem ); pfPageLoad( ptName, ptCont, cchItem ); iNumber++; FREE( ptCont ); FREE( ptName ); pcCaret = pcEnd; }while( *pcCaret ); // データ有る限りループで探す return iNumber; }
/*! AA表示スタティックのオーナードロー・描画 @param[in] hWnd 親ウインドウハンドル @param[in] *pstDrawItem ドロー情報 @return なし */ VOID AaItemsDrawItem( HWND hWnd, CONST DRAWITEMSTRUCT *pstDrawItem ) { UINT_PTR rdLen; INT_PTR rdLength; LPSTR pcConts = NULL; LPTSTR ptConStr = NULL; RECT rect, drawRect; POINT stPoint; VIEWORDER stVwrder; INT rdNextItem; LONG rdDrawPxTop, rdBottom; // 描画の最上位、描画領域の高さMAX LONG rdHeight, rdWidth; // アイテムの高さ・描画領域の幅 HPEN hOldPen; // 項目の外接四角形の取得 rect = pstDrawItem->rcItem; rdBottom = rect.bottom; rdWidth = rect.right; rdDrawPxTop = 0; SetBkMode( pstDrawItem->hDC , TRANSPARENT ); // 文字描画は背景透過で夜露死苦 FillRect( pstDrawItem->hDC, &rect, ghBkBrush ); // 一旦背景塗りつぶして gvcViewOrder.clear(); rdNextItem = gixTopItem; for( rdDrawPxTop = 0; rdBottom > rdDrawPxTop; rdNextItem++ ) { pcConts = AacAsciiArtGet( rdNextItem ); // 一覧のトップを確認 if( !pcConts ){ break; } stVwrder.index = rdNextItem; ptConStr = SjisDecodeAlloc( pcConts ); // 表示内容ガメてくる StringCchLength( ptConStr, STRSAFE_MAX_CCH, &rdLen ); rdLength = rdLen; free( pcConts ); #pragma message ("MAAの行間、ここで正しく計算するべき") // 文字列に合わせてRECT確保・計算だけで、まだ書込してない DrawText( pstDrawItem->hDC, ptConStr, rdLength, &rect, DT_LEFT | DT_EDITCONTROL | DT_NOPREFIX | DT_CALCRECT ); drawRect = rect; rdHeight = drawRect.bottom; drawRect.bottom += rdDrawPxTop; drawRect.top = rdDrawPxTop; if( drawRect.right < rdWidth ) drawRect.right = rdWidth; stVwrder.dHeight = rdHeight; stVwrder.dUpper = drawRect.top; stVwrder.dDownr = drawRect.bottom; // 項目ごとに互い違いの色にするか、区切り線を引く if( gbLineSep ){ FillRect( pstDrawItem->hDC, &drawRect, ghBkBrush ); } else { if( 1 & rdNextItem ) FillRect( pstDrawItem->hDC, &drawRect, GetStockBrush(LTGRAY_BRUSH) ); else FillRect( pstDrawItem->hDC, &drawRect, ghBkBrush ); } // AA描画 DrawText( pstDrawItem->hDC, ptConStr, rdLength, &drawRect, DT_LEFT | DT_EDITCONTROL | DT_NOPREFIX ); if( gbLineSep ) // 線を引く { hOldPen = SelectPen( pstDrawItem->hDC, ghSepPen ); MoveToEx( pstDrawItem->hDC, drawRect.left, drawRect.bottom-1, NULL ); LineTo( pstDrawItem->hDC, drawRect.right, drawRect.bottom-1 ); SelectPen( pstDrawItem->hDC, hOldPen ); } gvcViewOrder.push_back( stVwrder ); rdDrawPxTop += rdHeight; free( ptConStr ); } InvalidateRect( ghScrollWnd, NULL, TRUE ); UpdateWindow( ghScrollWnd ); // カーソル位置確保し直し・ポッパップ表示用 GetCursorPos( &stPoint ); ScreenToClient( ghItemsWnd, &stPoint ); Aai_OnMouseMove( hWnd, stPoint.x, stPoint.y, 0 ); return; }
/*! ユーザ定義のアレを読み込む @param[in] hWnd メインウインドウハンドル @param[in] bFirst 今回が最初であるか @return 非0中身取った処理した 0ファイルなかった */ INT UserDefInitialise( HWND hWnd, UINT bFirst ) { CONST WCHAR rtHead = 0xFEFF; // ユニコードテキストヘッダ WCHAR rtUniBuf; HANDLE hFile; DWORD readed; LPVOID pBuffer; // 文字列バッファ用ポインター INT iByteSize; LPTSTR ptString; LPSTR pcText; UINT cchSize; if( bFirst ) // 最初ならパス作っておく { ZeroMemory( gatUsDfPath, sizeof(gatUsDfPath) ); StringCchCopy( gatUsDfPath, MAX_PATH, ExePathGet() ); PathAppend( gatUsDfPath, TEMPLATE_DIR ); PathAppend( gatUsDfPath, USER_ITEM_FILE ); } hFile = CreateFile( gatUsDfPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( INVALID_HANDLE_VALUE == hFile ){ return 0; } // 今の内容破棄 UserDefObliterate( hWnd ); iByteSize = GetFileSize( hFile, NULL ); pBuffer = malloc( iByteSize + 2 ); ZeroMemory( pBuffer, iByteSize + 2 ); // 中身をいただく SetFilePointer( hFile, 0, NULL, FILE_BEGIN ); ReadFile( hFile, pBuffer, iByteSize, &readed, NULL ); CloseHandle( hFile ); // 内容全部取り込んだから開放 // ユニコードチャック CopyMemory( &rtUniBuf, pBuffer, 2 ); if( rtHead == rtUniBuf ) // ユニコードヘッダがあれば { ptString = (LPTSTR)pBuffer; ptString++; // ユニコードヘッダ分進めておく } else { pcText = (LPSTR)pBuffer; // シフトJISを開く場合、�の部分をどうにかせんといかん ptString = SjisDecodeAlloc( pcText ); // SJISの内容をユニコードにする FREE( pBuffer ); // こっちで開放 pBuffer = ptString; // ポイントするところを変更 } StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize ); // ASTじゃなきゃダメ if( !( StrCmpN( AST_SEPARATERW, ptString, 4 ) ) ) { DocStringSplitAST( ptString , cchSize, UserDefItemLoad ); } FREE( pBuffer ); UserDefAppendMenu( hWnd ); return 1; }