VC++ unicode环境下使用textout输出中英文字符

在MFC中,我使用unicode编码,中文字符、数字、英语字符都是双字节,
这样一来,输出中文字符正常,但是英语和数字字符,显示出来也会占两
个字符的宽度,感觉怪怪的!

图片说明

我是在TextOut输出时遇到这样的问题,大家有什么好办法吗? 谢谢!

c++

3个回答

使用WideCharToMultiByte对字符串进行转换,再使用textoutA 输出试试

字体问题吧,换个字体输出试试

用DrawText代替TextOut
https://blog.csdn.net/heibao111728/article/details/88375448

VERIFY(new_font.CreatePointFont(250, _T("宋体"), pDc));
这里可以设置字体,比如说你可以用Arial

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
VC++ unicode环境下使用textout输出中英文字符
在MFC中,我使用unicode编码,中文字符、数字、英语字符都是双字节, 这样一来,输出中文字符正常,但是英语和数字字符,显示出来也会占两 个字符的宽度,感觉怪怪的! ![图片说明](https://img-ask.csdn.net/upload/201908/18/1566092840_495229.jpg) 我是在TextOut输出时遇到这样的问题,大家有什么好办法吗? 谢谢!
求问WinApi中输出字符串时如何控制无论字符串多长,始终位于中间?
请教一下各位 初学winapi,在要求输出一串字符串时,我用textout函数控制输出的起始位置 但是由于输出的字符串长度可能不等,无法控制使得整个字符串位于区域的中间? 请问各位怎么解决?
c# hook TextOut API问题
本人菜鸟,想获取屏幕上所有的字符,看了不少方法,觉得截取Textout这个函数比较靠谱,但是又不知道怎么去hook,所以问问各位大神,有没有什么好的办法? 最好是有源码的那种,报酬多多。谢谢各位大神。本人qq1944931596
未声明标识符?强制转化也不行
#include "stdafx.h" #include "afxmt.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "Porject1.h" #endif #include "Porject1Doc.h" #include "Porject1View.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CPorject1View IMPLEMENT_DYNCREATE(CPorject1View, CFormView) BEGIN_MESSAGE_MAP(CPorject1View, CFormView) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() ON_BN_CLICKED(IDC_DATA_LINE, &CPorject1View::OnDataLine) ON_BN_CLICKED(IDC_END_DATA_LINE, &CPorject1View::OnEndThread) ON_WM_PAINT() ON_STN_CLICKED(IDC_DATA_ON_TIME, &CPorject1View::OnDataOnTime) ON_STN_CLICKED(IDC_DATA_ON_TIME_thread, &CPorject1View::OnStnClickedDataOnTimethread) END_MESSAGE_MAP() // CPorject1View 构造/析构 CPorject1View::CPorject1View() : CFormView(CPorject1View::IDD) { // TODO: 在此处添加构造代码 } CPorject1View::~CPorject1View() { } void CPorject1View::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); } BOOL CPorject1View::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CFormView::PreCreateWindow(cs); } void CPorject1View::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } void CPorject1View::OnRButtonUp(UINT /* nFlags */, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CPorject1View::OnContextMenu(CWnd* /* pWnd */, CPoint point) { #ifndef SHARED_HANDLERS theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } // CPorject1View 诊断 #ifdef _DEBUG void CPorject1View::AssertValid() const { CFormView::AssertValid(); } void CPorject1View::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } CPorject1Doc* CPorject1View::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPorject1Doc))); return (CPorject1Doc*)m_pDocument; } #endif //_DEBUG // CPorject1View 消息处理程序 CEvent EndPaintLine;//用来控制绘制线程结束的事件 POINT polyLine[31];//存放动态数据曲线数据值的数组 DWORD pLinePoints;//当前需绘制曲线的点数 int TimeSpan_GetData;//绘制动态曲线的时间间隔,具体系统中可在界面上加一微调按钮调整 CBrush * pBrushBlack = new CBrush; void CPorject1View::OnDataLine() { // TODO: 在此添加控件通知处理程序代码 //启动工作线程并画出绘制动态曲线的子窗口的背景矩形框 CWnd*pWnd = GetDlgItem(IDC_DATA_ON_TIME_thread); //获取绘制曲线文本框窗口指针 CDC * pDC = pWnd->GetDC(); CGdiObject * pOldBursh = pDC->SelectObject(pBrushBlack); pDC->Rectangle(0, 0, 300, 200); //用黑色绘制显示动态数据曲线的子窗口 pDC->SelectObject(pOldBursh); CWinThread * pThreadDataOnTime = AfxBeginThread(DataLineThread,(LPVOID )GetSafeHwnd(), THREAD_PRIORITY_NORMAL); } void CPorject1View::OnEndThread() { // TODO: 在此添加控件通知处理程序代码 EndPaintLine.SetEvent(); } void CPorject1View::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CFormView::OnPaint() CWnd * pWnd = GetDlgItem(IDC_DATA_ON_TIME_thread); //获取绘制曲线的文本框指针 pWnd->Invalidate(); pWnd->UpdateWindow(); CDC * pDC = pWnd->GetDC(); CGdiObject * pOldBrush = pDC->SelectObject(pBrushBlack); pDC->Rectangle(0, 0, 300, 200); //绘制图曲线的矩形区域 pDC->SelectObject(pOldBrush); } void CPorject1View::OnDataOnTime() { // TODO: 在此添加控件通知处理程序代码 } UINT DataLineThread(LPVOID lp) { CPen * pPenGreen = new CPen; CPen * pPenBlack = new CPen; CPen * pPenBKcolor = new CPen; CPen * pPenRed = new CPen; CPen * pPenBlue = new CPen; CBrush * pBrushBlack = new CBrush; pPenRed->CreatePen(PS_DOT, 1, RGB(255, 0, 0)); pPenBlue->CreatePen(PS_DOT, 1, RGB(10, 150, 255)); pPenBlack->CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); pPenGreen->CreatePen(PS_SOLID, 1, RGB(0, 255, 0)); pPenBKcolor->CreatePen(PS_SOLID, 1, RGB(190, 190, 190)); pBrushBlack->CreateSolidBrush(RGB(0, 0, 0)); CWnd * pMainWnd = AfxGetMainWnd(); CWnd * pClient = pMainWnd->GetWindow(GW_CHILD); CWnd * pData = pClient->GetDlgItem(IDC_DATA_ON_TIME_thread); CDC * pDC = pData->GetDC(); BOOL runThread = TRUE; while (runThread) { CWnd * pWnd =pClient-> GetDlgItem(IDC_DATA_ON_TIME); CDC * pDC = pWnd->GetDC(); CGdiObject * pOldPen = pDC->SelectObject(pPenBlue); static int count_T = 0; pDC->SetBkColor(RGB(0, 0, 0)); for (int i = 0; i <= 30; i += 5) { if (300 - 10 * (i + count_T) >= 0) { pDC->MoveTo(300 - 10 * (i + count_T), 200); pDC->LineTo(300 - 10 * (i + count_T), 0); if ((i + count_T - 1) >= 0) { CGdiObject * pPenT = pDC->SelectObject(pPenBlack); pDC->MoveTo(300 - 10 * (i + count_T - 1), 200); pDC->LineTo(300 - 10 * (i + count_T - 1), 0); pDC->SelectObject(pPenT); } } pDC->SelectObject(pOldPen); count_T++; if (count_T == 5) count_T = 0; char tm[20]; _strtime(tm); pDC->SetBkColor(RGB(190, 190, 190)); pDC->TextOut(280, 205,_T("tm")); for (i = 0; i <= 20; i += 5) { pOldPen = pDC->SelectObject(pPenRed); pDC->SetBkColor(RGB(0, 0, 0)); pDC->MoveTo(0, i * 10); pDC->LineTo(300, i * 10); pDC->SelectObject(pOldPen); } if (pLinePoints >= 2) { pOldPen = pDC->SelectObject(pPenBlack); pDC->Polyline(polyLine, pLinePoints); pDC->SelectObject(pOldPen); } static int col = 0; int m_OnData; char mC[40]; if (col < 31) { for (int j = 0; j <= col; j++) polyLine[j].x = 300 - (col - j) * 10; m_OnData = rand()%200; polyLine[col].y = m_OnData; col++; pLinePoints++; } else { pLinePoints = 31; for (int t = 0; t < 30; t++) polyLine[t].y = polyLine[t + 1].y; m_OnData = rand()%200; polyLine[30].y = m_OnData; } itoa(m_OnData, mC, 10); pDC->SetBkColor(RGB(190, 190, 190)); pDC->TextOut(310, 35, _T("实时数据")); if (pLinePoints >= 2) { pOldPen = pDC->SelectObject(pPenGreen); pDC->Polyline(polyLine, pLinePoints); pDC->SetTextColor(RGB(0, 0, 0)); pDC->SelectObject(pOldPen); } int retCode = ::WaitForSingleObject(EndPaintLine.m_hObject, 0); if (retCode == WAIT_OBJECT_0) runThread = FALSE; ::Sleep(TimeSpan_GetData); } delete pPenRed; delete pPenBlue; delete pPenGreen; delete pPenBlack; delete pPenBKcolor; delete pBrushBlack; return 0; } } void CPorject1View::OnStnClickedDataOnTimethread() { // TODO: 在此添加控件通知处理程序代码 } error C2065: “DataLineThread”: 未声明的标识符
窗口显示不出汉字 打印机也打印不出汉字 textout函数输出汉字变为 |竖线
#include <windows.h> #include <stdio.h> LPCTSTR bmp_filename = "C:\\photo\\aaa.bmp"; LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); HWND hwMain; HANDLE hbmp = NULL; const int ID_FILE_PRINT = __LINE__; int get_line_height(HDC hdc) { //return text line height //return value < 0 if map mode is not MM_TEXT, so that you can always use //y+= line_height when drawing to device. int map_mode = GetMapMode(hdc); TEXTMETRIC tm; GetTextMetrics(hdc,&tm); int h = tm.tmHeight + tm.tmExternalLeading; if(MM_TEXT != map_mode) h = 0 - h; return h; } double get_screen_pixel_width(int map_mode) { //purpose: a pixel displayed in MM_TEXT mode should be about the same size //when displayed in other map mode. HDC hdc = GetDC(NULL); double hroz_size = GetDeviceCaps(hdc,HORZSIZE);//Width, in millimeters, of the physical screen. double horz_res = GetDeviceCaps(hdc, HORZRES);//Width, in pixels, of the screen. double pixel_width = hroz_size / horz_res; // Width, in millimeters // 1 inch = 25.4 mm const double INCH_TO_MM = 25.4; const double INCH_TO_TWIP = 1440; switch(map_mode) { case MM_LOMETRIC: pixel_width *= 10; break; case MM_HIMETRIC: pixel_width *= 100; break; case MM_TEXT: break; case MM_LOENGLISH: //Each logical unit is mapped to 0.01 inch pixel_width = pixel_width / INCH_TO_MM * 100; break; case MM_HIENGLISH: //Each logical unit is mapped to 0.001 inch pixel_width = pixel_width / INCH_TO_MM * 1000; break; case MM_TWIPS: //Each logical unit is mapped to one twentieth of a printer's point (1/1440 inch, also called a twip). pixel_width = pixel_width / INCH_TO_MM * INCH_TO_TWIP; break; default: break; } return pixel_width;//Width, in logical units according to the map_mode } void draw(HDC hdc) { if(hbmp == NULL) { hbmp = (HANDLE)LoadImage( NULL,bmp_filename , IMAGE_BITMAP, 0,0,LR_LOADFROMFILE); } int map_mode = MM_TWIPS; LPCTSTR map_name1 ="abc我想打印中文"; LPCTSTR map_name2 = "def我想打印中文"; SetMapMode(hdc,map_mode); //Each logical unit is mapped to 0.1 millimeter. int x = 0; int y = 0; int line_h = get_line_height(hdc); SelectObject(hdc,GetStockObject(BLACK_PEN)); SetBkMode(hdc, TRANSPARENT); int len = strlen(map_name1); len = strlen(map_name2); TextOut(hdc,x, y,map_name1,strlen(map_name1)); y += line_h; TextOut(hdc,x, y,map_name2,strlen(map_name2)); if( NULL != hbmp) { x=x+2500;y=0; BITMAP bm; GetObject( hbmp, sizeof(BITMAP), &bm ); long width=bm.bmWidth; long height=bm.bmHeight; HDC memdc = CreateCompatibleDC(hdc); HGDIOBJ oldbmp = SelectObject(memdc,hbmp); double pixel_size = get_screen_pixel_width(map_mode); int bmp_draw_width = (int)(width * pixel_size) ; int bmp_draw_height = (int)(height * pixel_size) ; StretchBlt(hdc,x,y, bmp_draw_width ,-bmp_draw_height, memdc, 0,0,width,height,SRCCOPY); SelectObject(memdc,oldbmp); DeleteDC(memdc); } else { LPCTSTR error_msg = "failed to load bitmap from file"; TextOut(hdc,x,5*y,error_msg,strlen(error_msg)); } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { MSG msg; WNDCLASSEX wndclass ; HMENU hMenu,hMenuA; wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL; wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "PrintDemo"; wndclass.hIconSm = NULL; RegisterClassEx (&wndclass); hwMain=CreateWindow (wndclass.lpszClassName,NULL,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,500,568,NULL,NULL,hInstance,NULL); hMenu=CreateMenu(); hMenuA=CreateMenu(); AppendMenu(hMenuA,MF_STRING,ID_FILE_PRINT,"Print"); AppendMenu(hMenu,MF_POPUP,(UINT)hMenuA,"File"); SetMenu(hwMain,hMenu); ShowWindow (hwMain,iCmdShow); UpdateWindow (hwMain); while (GetMessage (&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static PRINTDLG pd; static DOCINFO dci; static LPTSTR lpszDocName="Print Test"; switch (iMsg) { case WM_CREATE: pd.lStructSize=sizeof(pd); pd.hwndOwner=hwnd; pd.hDevMode=NULL; pd.hDevNames=NULL; pd.Flags=PD_RETURNDC|PD_HIDEPRINTTOFILE |PD_RETURNDEFAULT; pd.nFromPage=1; pd.nToPage=1; pd.nMinPage=1; pd.nMaxPage=1; pd.nCopies=1; dci.cbSize=sizeof(dci); dci.lpszDocName=lpszDocName; dci.lpszOutput=NULL; dci.lpszDatatype=NULL; dci.fwType=0; return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILE_PRINT: if (!PrintDlg(&pd)) return 0; hdc=pd.hDC; StartDoc(hdc,&dci); StartPage(hdc); draw(hdc); EndPage(hdc); EndDoc(hdc); break; } return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); draw(hdc); EndPaint(hwnd,&ps); return 0; case WM_DESTROY : PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }
VC++ MFC的CDC控件如何用按钮滚动显示内容
for(int i=0;i<50;i++) { CString str; str.Format(_T("%d"), i); pDC->TextOut(50,50+i*50,str); } ``` 在CDC控件上显示0-50行内容,运行后,CDC界面上可以显示0-10行, 现在想通过一个按钮,点击一下,就向上显示一行,程序应该怎么操作? ```
TextOut函数的CreatFont设置字体具体操作?
CFont font; font.creatFont(//这里设置了一系列参数,不打出来了); 然后直接可以TextOut()输出了吗?
MFC怎么根据树控件在View下输出文字?
![图片说明](https://img-ask.csdn.net/upload/201701/23/1485181325_752543.png) 答题区是一个Scrollview视图,左边是一个带树控件的对话框,通过选定树内的不同对象,我想实现从数据库输出不同的文字在右边的视图内,由于后面升级题目会涉及图片,所以不能基于对话框使用Edit控件只能在view上。现在我通过OnNMRDblclkTree1消息响应,想要实现输出,使用textout却输出不了,我不知道是不是我的思路错了还是什么?
VC++6.0想在单文档中随机输入26个小写字母,为什么调用了TextOut却什么也没显示出来呢?
更新一下自己的代码 ``` int i = 0,j = 0; void CWangLiuLin190304View::OnDraw(CDC* pDC) { CWangLiuLin190304Doc* pDoc = GetDocument(); if(j == 10) ::TextOut((pDC->GetSafeHdc()),0,0,"\n\r",lstrlen("\n\r"));//每10个换行 if(i == 1) { int a; a = rand()%25; a += 'a'; ::TextOut((pDC->GetSafeHdc()),0,0,((CString)a),lstrlen((CString)a)); } ASSERT_VALID(pDoc); // TODO: add draw code for native data here } ``` 两段代码 ``` void CWangLiuLin190304View::OnBegin() { // TODO: Add your command handler code here SetTimer(1,500,NULL); i = 1; } void CWangLiuLin190304View::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default j++; if(i == 1) { CDC *pDC=GetDC(); //调用OnDraw(pDC)重画 OnDraw(pDC); } if(j == 99) { KillTimer(1);//100个结束 } //CView::OnTimer(nIDEvent); } void CWangLiuLin190304View::OnEnd() { // TODO: Add your command handler code here i = 0; KillTimer(1); } ```
textout 钩子函数为何无法触发
我从网上下了部分代码,写了一个钩子函数获取textout输出内容。一个是包含钩子函数的DLL程序包,另一个应用程序安装了改钩子,调用了TextOut之后。 DLL里的TextOut钩子函数未被调用,请大侠指点一下问题出在哪儿? 附DLL 钩子程序包。 CPP部分: #include "stdafx.h" #include "hook.h" #include "winuser.h" #include <ImageHlp.h> #include <tlhelp32.h> #pragma comment(lib,"ImageHlp") //定义全局共享数据段 #pragma data_seg("Shared") HMODULE hmodDll=NULL; HHOOK hHook=NULL; #pragma data_seg() #pragma comment(linker,"/Section:Shared,rws") //设置全局共享数据段的属性 //dll的入口点 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; } hmodDll=hModule; return TRUE; } void WINAPI HookOneAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress, PROC pfnDummyFuncAddress,HMODULE hModCallerModule) { ULONG size; //获取指向PE文件中的Import中IMAGE_DIRECTORY_DESCRIPTOR数组的指针 PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hModCallerModule,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size); if (pImportDesc == NULL) return; //查找记录,看看有没有我们想要的DLL for (;pImportDesc->Name;pImportDesc++) { LPSTR pszDllName = (LPSTR)((PBYTE)hModCallerModule+pImportDesc->Name); if (lstrcmpiA(pszDllName,pszCalleeModuleName) == 0) break; } if (pImportDesc->Name == NULL) return; //寻找我们想要的函数 PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)((PBYTE)hModCallerModule+pImportDesc->FirstThunk); for (;pThunk->u1.Function;pThunk++) { //ppfn记录了与IAT表项相应的函数的地址 PROC * ppfn= (PROC *)&pThunk->u1.Function; if (*ppfn == pfnOriginApiAddress) { //如果地址相同,也就是找到了我们想要的函数,进行改写,将其指向我们所定义的函数 WriteProcessMemory(GetCurrentProcess(),ppfn,&(pfnDummyFuncAddress), sizeof(pfnDummyFuncAddress),NULL); return; } } } //查找所挂钩的进程所应用的dll模块的 BOOL WINAPI HookAllAPI (LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress, PROC pfnDummyFuncAddress,HMODULE hModCallerModule) { if (pszCalleeModuleName == NULL) return FALSE; if (pfnOriginApiAddress == NULL) return FALSE; MEMORY_BASIC_INFORMATION mInfo; HMODULE hModHookDLL; HANDLE hSnapshot; MODULEENTRY32 me = {sizeof(MODULEENTRY32)}; //MODULEENTRY32:描述了一个被指定进程所应用的模块的struct VirtualQuery(HookOneAPI,&mInfo,sizeof(mInfo)); hModHookDLL=(HMODULE)mInfo.AllocationBase; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0); BOOL bOk = Module32First(hSnapshot,&me); if (bOk == FALSE) return FALSE; while (bOk) { if (me.hModule != hModHookDLL) { hModCallerModule = me.hModule;//赋值 //me.hModule:指向当前被挂钩进程的每一个模块 HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress, pfnDummyFuncAddress,hModCallerModule); } bOk = Module32Next(hSnapshot,&me); } return TRUE; } //通过使pfnDummyFuncAddress与pfnOriginApiAddress相等的方法,取消对IAT的修改 BOOL WINAPI UnhookAllAPIHooks(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress, PROC pfnDummyFuncAddress,HMODULE hModCallerModule) { PROC temp; temp = pfnOriginApiAddress; pfnOriginApiAddress = pfnDummyFuncAddress; pfnDummyFuncAddress = temp; return HookAllAPI(pszCalleeModuleName,pfnOriginApiAddress, pfnDummyFuncAddress,hModCallerModule); } //钩子子程。与其它钩子子程不大相同,没做什么有意义的事情,继续调用下一个钩子子程,形成循环 LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam) { return CallNextHookEx(hHook,code,wParam,lParam); } void __declspec(dllexport) WINAPI InstallHook(BOOL IsHook,DWORD dwThreadId) { if(IsHook) { hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,dwThreadId); //GetProcAddress(GetModuleHandle("GDI32.dll"),"ExtTextOutA"):取得要钩的函数在所在dll中的地址 HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"), "TextOutW"),(PROC)&H_TextOutW,NULL); HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"), "TextOutA"),(PROC)&H_TextOutA,NULL); } else { UnInstallHook(); //Beep(440,1000); UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"), "TextOutA"),(PROC)&H_TextOutA,NULL); UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"), "TextOutW"),(PROC)&H_TextOutW,NULL); } } //卸载钩子 BOOL WINAPI UnInstallHook() { UnhookWindowsHookEx(hHook); return TRUE; } /*======================TextOutA/W 接口函数=========================================*/ BOOL WINAPI H_TextOutA(HDC hdc,int nXStart,int nYStart,LPCSTR lpString,int cbString) { MessageBox(NULL,"textout captured!!!","test",MB_OK); TextOut(hdc,nXStart,nYStart,LPCSTR(lpString),cbString);//返回原来的函数,以显示字符 return TRUE; } BOOL WINAPI H_TextOutW(HDC hdc,int nXStart,int nYStart,LPCSTR lpString,int cbString) { MessageBox(NULL,"TextOutW","APIHook_Dll ---rivershan",MB_OK); TextOut(hdc,nXStart,nYStart,LPCSTR(lpString),cbString);//返回原来的函数,以显示字符 return TRUE; } H文件部分: #ifdef HOOK_EXPORTS #define HOOK_API __declspec(dllexport) #else #define HOOK_API __declspec(dllimport) #endif extern HOOK_API int nHook; HOOK_API int fnHook(void); void __declspec(dllexport) WINAPI InstallHook(BOOL,DWORD); BOOL WINAPI UnInstallHook(); LRESULT CALLBACK GetMsgProC(int code,WPARAM wParam,LPARAM lParam); void WINAPI HookOneAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress, PROC pfnDummyFuncAddress,HMODULE hModCallerModule); BOOL WINAPI HookAllAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress, PROC pfnDummyFuncAddress,HMODULE hModCallerModule); BOOL WINAPI UnhookAllAPIHooks(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress, PROC pfnDummyFuncAddress,HMODULE hModCallerModule); BOOL WINAPI H_TextOutA(HDC, int, int, LPCSTR, int); BOOL WINAPI H_TextOutW(HDC, int, int, LPCSTR, int);
屏幕取词 挂接 Textout无效
![图片说明](https://img-ask.csdn.net/upload/201903/21/1553131891_933186.png) 有同学对屏幕取词技术有研究吗? 想要取到上图中的油枪编号, 但是简单的挂接 Textout ,ExtTextout 函数取不到数据 那位大师 可以提供提供思路呀
关于VC++中dc设备上下文的理解,文本编程
在孙鑫老师的VC++视频教程中学习文本编程看到下面的代码: if (0x08 == nChar) { COLORREF clr = dc.SetTextColor (dc.GetBkColor ()); dc.TextOut (m_ptOrigin.x ,m_ptOrigin.y ,m_strLine); m_strLine = m_strLine.Left (m_strLine.GetLength ()-1); dc.SetTextColor (clr); } else { m_strLine += nChar; } 其中取了背景色作为当前字体的颜色,最后又用dc.SetTextColor (clr);是什么意思,孙鑫老师在视频中说是要设置回先前的颜色,为什么要设置回,是因为怕以后调用的时候有影响么?还有为什么调用回原来的颜色,依然要取clr,clr中不是调用的是背景色么?要调回原来的颜色不是需要要原来的前景色么? 求解答!
MFC中怎么把输出的文字删除
pDC->TextOut(50,50,table1.GetAt(i); 在(50,50)输出table1.GetAt(i),怎么把界面中的这个删了
【c-WinAPI】 程序运行崩溃(自己写的函数出错),求大神帮忙!!!!
# 先行说明: ## 工程简要说明 说明下,这个工程一共5个文件(两个头文件,三个资源文件): 头文件中,一个是宏定义用文件【WinMacro.h】,另一个是函数声明用文件【WinHead.h】; 资源文件中,一个是窗口注册文件(基本可以忽略)【WinMain.c】,第二个是窗口过程文件【WinProc.c】,最后一个里是函数定义文件(主要出错的地方)【WinSupport.c】。 ## 编译器介绍 这里我用的是Dev c++ (v.5.11)编译器,有段时间入了学生联赛的坑,然后现在就有点停不下来,对VC没什么好感,emmm。 ## 对于ERROR的探索 我本来是希望用TextOut函数做一个模拟DrawText函数的新函数:TextPrint,后续还想给它添加一些独特的输出特效,不过现在看来都运行不了(一运行就立即报错,但是编译没问题),尴尬。 万恶的Dev c++调试功能有问题,找了很长时间解决办法之后,就调试了一下,结果就...完全看不懂了。 在下面我标注的【图6】第27行(WinSupport.c)这里单步调试会终止,并弹出显示: > program received signal SIGFPE, Airthmetic expection 然后会显示 Windows CPU 运行表(大概是这个叫法...),但还是看不懂。所以我后面修改了代码,把27、28行都改成了将那两个变量赋值为常数2,而不是即时计算。 顺便改了一下74行,把pcText换成了pChar (74行这里是自己发现的逻辑错误)。 现在各位看到的代码是最初的版本,上面的修改在下面附的代码里都未体现。不是说我懒的修改,而是因为我想把这里弄明白,到底是什么原因。 修改后的代码其实也有问题,那就是虽然可以运行,但是假如在一个矩形内输出了n(n>1)行,那么只有第一行能被保留(啊啊啊,要疯了!!!) ## 最终预期功能 嗯,这里在重申一下,那个TextPrint函数是低配版的DrawText函数,功能就是指定一个矩形,然后向矩形范围内输出(每行填满后自动换行)(假如要输出的内容填满了整个矩形都没有输出完,那就停止输出)。 ## 一些个人看法 自己也试了许多次,但就是不太清楚其中机理,只好劳烦各位“达人”了。 我是直接看书自学的WinAPI,没什么耐性,就先用刚学的新函数TextOut练练手, 所以...挖了个大坑。 个人感觉应该是WinAPI"可重入"的锅,但是实在是没有接触过面向对象的编程(只会一点C),so...... ## 致谢 (.-..-.)刚刚注册的号,学生党一枚,初次提问,言谢在先! # 源代码: 【WinMacro.h】: ```c #define CLASSNAME "Program: Get Seated" #define APPNAME "Tiny Spotlessness: The Seats" #define SIZE_101 SIZEOFSTRING #define SIZEOFSTRING 100 #define EMPTY INITIAL #define INITIAL 0 #define CXSCREEN GetSystemMetrics (SM_CXSCREEN) #define CYSCREEN GetSystemMetrics (SM_CYSCREEN) #define FAULTMSG_101 FAULTMSG_WNDNTNEEDED #define FAULTMSG_WNDNTNEEDED "Fault 101: WindowsNTneeded!" ``` 【图1】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562392986_229499.png) 【WinHead.h】: ```c /*---------------------------------------------------------------- Supporting Header Files -----------------------------------------------------------------*/ #include <windows.h> #include <stdbool.h> #include "WinMacro.h" /*---------------------------------------------------------------- Supporting Value Structions -----------------------------------------------------------------*/ /*---------------------------------------------------------------- Supporting Function Statements -----------------------------------------------------------------*/ LRESULT CALLBACK WndProc ( /*--------------------------------------*/ HWND hwnd, /* Stating the Main Window Process, */ UINT message, /* a special function with four para- */ WPARAM wParam, /* meters, using the other functions. */ LPARAM lParam /*--------------------------------------*/ ); int TextPrint( /*--------------------------------------*/ HDC hdc, /* Print on any place of rect, using */ RECT *pRect, /* a pointer to rect and a pointer to */ const TEXTMETRIC *pTm, /* the text metric, a string with */ const TCHAR *pcText, /* its length, and return the number */ int iLenth /* of the characters outputted. */ ); ``` 【图2】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393250_936313.png) 【图3】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393275_813852.png) 【WinMain.c】: ```c /*-------------------------------------- WinMain.c, (c) Shen Pengfei, 2019 --------------------------------------*/ #include "WinHead.h" int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { TCHAR szClassName[] = TEXT (CLASSNAME); TCHAR szAppName[] = TEXT (APPNAME); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = EMPTY; wndclass.cbWndExtra = EMPTY; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszClassName = szClassName; wndclass.lpszMenuName = NULL; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT (FAULTMSG_WNDNTNEEDED), szAppName, MB_ICONERROR ); return EMPTY; } hwnd = CreateWindow ( szClassName, /* window class name */ szAppName, /* window caption name */ WS_OVERLAPPEDWINDOW | WS_VSCROLL, /* window style */ INITIAL, /* initial x position */ INITIAL, /* initial y position */ CXSCREEN, /* initial x size */ CYSCREEN, /* initial y size */ NULL, /* parent window handle */ NULL, /* window menu handle */ hInstance, /* program instance handle */ NULL /* creation parameters */ ); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); while (GetMessage (&msg, NULL, EMPTY, EMPTY)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } ``` 【图4】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393472_122237.png) 【图5】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393485_726445.png) 【WinSupport.c】: ```c /*------------------------------------------------ (c) Shen PengFei, 2019 A file to set up some functions to complite some special tasks. -------------------------------------------------*/ #include "WinHead.h" int TextPrint ( HDC hdc, RECT *pRect, const TEXTMETRIC *pTm, const TCHAR *pcText, int iLenth ) { static int iLine; static int iRaw; static int iCount; static const TCHAR *pChar; /*-------------------------------------------- Count the width and the Height of the screen, by the way, creating a pointer copying the address of initial string ---------------------------------------------*/ iLine = (pRect->right - pRect->left) / pTm->tmAveCharWidth; iRaw = (pRect->bottom - pRect->top) / (pTm->tmHeight + pTm->tmExternalLeading); pChar = pcText; for ( iCount = INITIAL; /*------------------------------------------------ To prevent the number of charaters outputt -ed on the screen from overring the string's, check if the result value of [PCHAR minus PCTEXT] was not larger than the length of the string. And also, to prevent the strin -g's overring the initial rect, check if the raw number over the max value counted and called IRAW. -------------------------------------------------*/ pChar - pcText < iLenth && iCount <= iRaw; /*------------------------------------------------ Change the outputting address of each raw, the position of the changed pointer to the string and Add the cyclelatte times value in turn each time, to end the running in time. -------------------------------------------------*/ pRect->top += pTm->tmHeight + pTm->tmExternalLeading, pChar += iLine, iCount ++ ) { /*----------------------------------------------- Solve the special condition that outputted characters' last raw is not enough to make the whole raw full, while may cause that the stuffs behind the address of the string fluent the system running. ------------------------------------------------*/ if ( iLenth % iLine != EMPTY && iCount == iLenth / iLine ) iLine = iLenth % iLine; TextOut ( hdc, pRect->left, pRect->top, pcText, iLine ); } /* Return the initial value used in turn */ pRect->left = pRect->top = INITIAL; return pChar - pcText; } ``` 【图6】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393526_633017.png) 【图7】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393538_23024.png) 【图8】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393576_200998.png) 【WinProc.c】: ```c /*----------------------------------------------- (c) Shen Pengfei, 2019 A file to create a series of windows, used by WINMAIN.C . ------------------------------------------------*/ #include "WinHead.h" LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { static int cxChar; static int cyChar; static RECT rectPrint; static TCHAR szText [SIZEOFSTRING]; HDC hdc; RECT rect; PAINTSTRUCT ps; TEXTMETRIC tm; switch (message) { case WM_CREATE: rectPrint.left = INITIAL; rectPrint.top = INITIAL; rectPrint.right = CXSCREEN; rectPrint.bottom = CYSCREEN; hdc = GetDC (hwnd); /*----------------------------------------- To get the text parameters on its width and height (may with the external leading). ------------------------------------------*/ GetTextMetrics (hdc, &tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC (hwnd, hdc); return EMPTY; case WM_SIZE : rectPrint.right = LOWORD (lParam); rectPrint.bottom = HIWORD (lParam); return EMPTY; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); /* Debugging part */ TextPrint ( hdc, &rectPrint, &tm, szText, wsprintf ( szText, TEXT ("sdaf") ) ); EndPaint (hwnd, &ps); return EMPTY; case WM_DESTROY: PostQuitMessage (EMPTY); return EMPTY; } return DefWindowProc (hwnd, message, wParam, lParam); } ``` 【图9】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393610_312365.png) 【图10】 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562393619_968385.png)
如何修改C++项目.项目使用多字节字符集,cpp文件内代码,使生成的程序支持UTF8字符编码
如何修改C++项目.项目使用多字节字符集,cpp文件内代码,使生成的程序支持UTF8字符编码 文件内容如下: //////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////// /////////////////////////////////// /////////////////////// #include "public.h" #include "../../RenderD3D/include/d3dfont.h" /* 表1 汉字编码范围 名称 | 第一字节 | 第二字节 --------|-------------------------|------------------------ GB2312 | 0xB0-0xF7(176-247) | 0xA0-0xFE(160-254) --------|-------------------------|------------------------- GBK0 | x81-0xFE(129-254) | 0x40-0xFE(64-254) --------|-------------------------|------------------------- Big5 | 0x81-0xFE(129-255) | 0x40-0x7E(64-126) | | 0xA1-0xFE(161-254) --------|-------------------------|------------------------ //*/ const UINT GBK_MIN_CHAR1 = 0x81; const UINT GBK_MAX_CHAR1 = 0xfe; // 决定列 第一字节 const UINT GBK_MIN_CHAR2 = 0x40; const UINT GBK_MAX_CHAR2 = 0xfe; // 决定行 第二字节 const UINT GB2312_MIN_CHAR1 = 0xa1; const UINT GB2312_MAX_CHAR1 = 0xf7; // 决定列 第一字节 const UINT GB2312_MIN_CHAR2 = 0xa0; const UINT GB2312_MAX_CHAR2 = 0xfe; // 决定行 第二字节 const UINT EN_MIN_CHAR = 33; const UINT EN_MAX_CHAR = 0x7f; inline bool isGB2312Code( WORD ch ) { int c1 = (ch & 0xff); int c2 = ((ch & 0xff00) >> 8); return GB2312_MIN_CHAR1 <= c1 && c1 <= GB2312_MAX_CHAR1 && GB2312_MIN_CHAR2 <= c2 && c2 <= GB2312_MAX_CHAR2; } inline WORD ComposeWchar(int c1,int c2) { return (c2 << 8) | c1; } inline void UncomposeWchar(WORD ch,int & c1,int & c2) { c1 = (ch & 0xff); c2 = ((ch & 0xff00) >> 8); } inline bool isSamePoint(stPointI pt1, stPointI pt2, int rate) { if ( (abs(pt1.x-pt2.x) < rate) && (abs(pt1.y-pt2.y) < rate) ) { return true; } return false; } //Get font point list form a char bool GetFontPointList(const WORD& cName, stPointI* pPointList, int& numPoint) { char name[32] = "新宋体"; char nameE[32] = "Arial"; char nameFT[32] = "Arial"; int width = 10; int height = 20; LOGFONT lf; memset(&lf,0,sizeof(LOGFONT)); numPoint = 0; lf.lfWidth=-width; lf.lfHeight=-height; lf.lfWeight=0; lf.lfCharSet=GB2312_CHARSET; lf.lfOutPrecision=OUT_DEFAULT_PRECIS; lf.lfClipPrecision=CLIP_DEFAULT_PRECIS; lf.lfQuality=PROOF_QUALITY; lf.lfPitchAndFamily=FIXED_PITCH|FF_DONTCARE; lf.lfItalic=0; strcpy(lf.lfFaceName,name); //Get font HFONT hFontFT = NULL; HFONT hFontE = NULL; HFONT hFont = CreateFontIndirect(&lf); if(nameE && nameE[0]){ strcpy(lf.lfFaceName,nameE); hFontE = CreateFontIndirect(&lf); } if(nameFT && nameFT[0] != 0){ strcpy(lf.lfFaceName,nameFT); hFontFT = CreateFontIndirect(&lf); } //TEXTMETRIC textMetric; COLORREF backgroundColorRef = RGB( 0, 0, 0); COLORREF foregroundColorRef = RGB(255, 255, 255); //Get font DC HDC fontDC; HBITMAP fontBMP; HGDIOBJ oldBmp, oldFont; fontDC = CreateCompatibleDC(NULL); fontBMP = CreateCompatibleBitmap(fontDC,256,256); oldBmp = SelectObject(fontDC, fontBMP); if(hFontE) oldFont = SelectObject(fontDC, hFontE); else oldFont = SelectObject(fontDC, hFont); // SetBkColor(fontDC, backgroundColorRef); SetTextColor(fontDC, foregroundColorRef); //Get english font if ( (cName>=EN_MIN_CHAR) && (cName<=EN_MAX_CHAR) ) { if(hFontE) { if(cName >= '0' && cName <= '9') SelectObject(fontDC, hFont); else SelectObject(fontDC, hFontE); } TextOut(fontDC,0,0,(char*)&cName,1); numPoint = 0; for(size_t i1=0;i1<height;++i1) { for(size_t j1=0;j1<width;++j1) { COLORREF color = GetPixel(fontDC,j1,i1); if(color & 0xffffff) { pPointList[numPoint++] = stPointI( j1, i1 ); } } } } else //Get chinese font { int c1,c2; UncomposeWchar( cName, c1, c2 ); WORD wName = ComposeWchar( c2, c1 ); WORD sz[2] = {wName,0}; if( hFontFT ) { if( isGB2312Code( wName ) ) SelectObject(fontDC, hFont); else SelectObject(fontDC, hFontFT); } else SelectObject( fontDC, hFont ); TextOut(fontDC,0,0,(char*)sz,2); if ( 0 ) { float cRate = 0.02f; int space = (int)(width * cRate); stPointI ptLast(0,0); for(size_t i1=0;i1<height;++i1) { for(size_t j1=0;j1<width*2;++j1) { COLORREF color = GetPixel(fontDC,j1,i1); if(color & 0xffffff) { if ( !isSamePoint( stPointI(j1,i1), ptLast, space ) ) { pPointList[numPoint++] = stPointI( j1, i1 ); ptLast = stPointI(j1,i1); } } } } } else { for(size_t i1=0;i1<height;++i1) { for(size_t j1=0;j1<width*2;++j1) { COLORREF color = GetPixel(fontDC,j1,i1); if(color & 0xffffff) { pPointList[numPoint++] = stPointI( j1, i1 ); } } } } } //Make center at point(0,0) stRectI rcBoundingBox; for( int i=0;i<numPoint;i++ ) { if ( i == 0 ) { rcBoundingBox.left = pPointList[0].x; rcBoundingBox.right = pPointList[0].x; rcBoundingBox.top = pPointList[0].y; rcBoundingBox.bottom = pPointList[0].y; } else { if ( pPointList[i].x < rcBoundingBox.left ) rcBoundingBox.left = pPointList[i].x; if ( pPointList[i].x > rcBoundingBox.right ) rcBoundingBox.right = pPointList[i].x; if ( pPointList[i].y < rcBoundingBox.top ) rcBoundingBox.top = pPointList[i].y; if ( pPointList[i].y > rcBoundingBox.bottom ) rcBoundingBox.bottom = pPointList[i].y; } } int nWidth = ( rcBoundingBox.left + rcBoundingBox.right ) / 2; int nHeight = ( rcBoundingBox.top + rcBoundingBox.bottom ) / 2; //Reset pos of point list for( int i=0;i<numPoint;i++ ) { pPointList[i] -= stPointI(nWidth, nHeight); } //Release res SelectObject(fontDC, oldBmp); SelectObject(fontDC, oldFont); DeleteObject(hFont); DeleteObject(hFontFT); DeleteObject(hFontE); DeleteObject(fontBMP); DeleteDC(fontDC); return numPoint > 0; } ///////////结束 /////////////////////////////////// /////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////
MFC drawtext无法绘制文字
我在视图上插入一个对话框,对话框有树状控件,根据树状控件的选择在视图上显示不同 文字,CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CSubSystem13View* pView = (CSubSystem13View*)pFrame->GetActiveView(); CDC* pdc = pView->GetDC(); 这样得到视图Pdc,我使用textout可以正常输出文字,因为要多行显示,我想使用 drawtext,pdc->DrawText(var,&pView->rect1,DT_CENTER);显示不出来,我觉得是没有正确获得rect,我想知道如何可以在对话框的树状控件的响应函数获得视图的客户区?
实现字符串的无限输入
。。。省去部分代码 TCHAR _String[20] = _T(""); // 文本 int len=0 。。。省去部分代码 switch(uMsg) { case WM_CHAR: HDC hdc; hdc=GetDC(hwnd); _String[len++] = (TCHAR)wParam; TextOut(hdc, 40, 20, _String,len); break; 这是 不才编写程序的部分代码,这里(_String[20])的限定只能输入输出20个汉字,怎么才能和window上记事本一样输入无限制啊?谢谢指教
因特殊限制,利用QWidget的函数getDC()返回的hdc绘图,只闪一次就被覆盖,
因条件限制:使用第三方动态库底层绘制地图图像,该库使用windows的GDI调用进行绘制,需要给该库提供一个hdc作为输出结果。 我在paintEvent函数中执行QWidget的getDc()函数可以返回该Widget的hdc,传递给动态库绘图后,界面只闪一下绘制图像就变成空白,请问如何让返回的hdc结果正确在QWidget上显示?? 代码如下: void myWidget::paintEvent(QPaintEvent * event) { HDC hdc = this->getDC(); thirdLibrary.outPut(hdc);//注解如下 /*该函数主要调用windows GDI将地图绘制在 传递进去的hdc中,并提供给我调用,可将该函数理解为 void output(HDC hdc) { TextOut(hdc,0,0,"地图",2); ...等等类似windows GDI函数 } */ this->releaseDC(); } 库将地图绘制到hdc上之后,Qt显示的地图只有一下,一闪就没了,变成空白显示了,请问如何解决?
VC中MFC视图中建立的其它控件,单击时这些控件的界面会显示到文本框的位置上
#define IDC_START_DT 10016 #define IDC_END_DT 10017 #define IDC_OPERATOR_COMB 10018 #define IDC_CARTYPE_COMB 10019 #define IDC_MIANFIE_EDT 10020 #define IDC_CHANNEL_COMB 10021 //控件定义 CDateTimeCtrl m_StartDt; CDateTimeCtrl m_EndDt; CComboBox m_OperatorComb; CComboBox m_CarTypeComb; CEdit m_MianFeiEdt; CComboBox m_ChannelComb; CMyListCtrl m_ListCtr; 在view上动态建立控件 int CReportView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here //生成开始时间 if(!m_StartDt.Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP | DTS_LONGDATEFORMAT,CRect(0,0,0,0), this, IDC_START_DT)) { return FALSE; } //生成结束时间 if(!m_EndDt.Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP | DTS_LONGDATEFORMAT,CRect(0,0,0,0), this, IDC_END_DT)) { return FALSE; } //生成操作员下拉框 if(!m_OperatorComb.Create(CBS_DROPDOWNLIST | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL, CRect(0,0,0, 0), this, IDC_OPERATOR_COMB)) { return FALSE; } //生成车类型下拉框 if(!m_CarTypeComb.Create(CBS_DROPDOWNLIST | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL, CRect(0,0,0, 0), this, IDC_CARTYPE_COMB)) { return FALSE; } //生成通道号下拉框 if(!m_ChannelComb.Create(CBS_DROPDOWNLIST | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL, CRect(0,0,0, 0), this, IDC_CHANNEL_COMB)) { return FALSE; } //生成免费编辑框 if(!m_MianFeiEdt.Create(ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, CRect(0,0,0, 0), this, IDC_MIANFIE_EDT)) { return FALSE; } return 0; } //改变控件位置 void CReportView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here if(IsWindow(m_StartDt))//开始时间 { CRect rc(65, 1, 235, 24); m_StartDt.MoveWindow(rc); } if(IsWindow(m_EndDt))//结束时间 { CRect rc(290, 1, 460, 24); m_EndDt.MoveWindow(rc); } if(IsWindow(m_OperatorComb)) { CRect rc(505, 2, 565, 250); m_OperatorComb.MoveWindow(rc); m_OperatorComb.SetItemHeight(-1, 16); } if(IsWindow(m_CarTypeComb)) { CRect rc(610, 2,670, 250); m_CarTypeComb.MoveWindow(rc); m_CarTypeComb.SetItemHeight(-1, 16); } if(IsWindow(m_ChannelComb))//道口 { CRect rc(700, 2,805, 250); m_ChannelComb.MoveWindow(rc); m_ChannelComb.SetItemHeight(-1, 16); } if(IsWindow(m_MianFeiEdt))//免费大于 { CRect rc(860, 1, 1110, 24); m_MianFeiEdt.MoveWindow(rc); } if(IsWindow(m_ListCtr)) { CRect rc(1,26,cx,cy-25); m_ListCtr.MoveWindow(rc); } } //初始化控件 void CReportView::OnInitialUpdate() { CView::OnInitialUpdate(); m_StartDt.SetFormat(L"yyy-MM-dd HH:mm:ss"); m_EndDt.SetFormat(L"yyy-MM-dd HH:mm:ss"); COleDateTime tmEnd = COleDateTime::GetCurrentTime(); COleDateTime tmStart = tmEnd - COleDateTimeSpan(1,0,0,0); m_StartDt.SetTime(tmStart); m_EndDt.SetTime(tmEnd); m_OperatorComb.AddString(L"所有"); m_OperatorComb.AddString(L"1"); m_OperatorComb.AddString(L"2"); m_OperatorComb.AddString(L"3"); m_OperatorComb.SetCurSel(0); m_CarTypeComb.AddString(L"所有"); m_CarTypeComb.AddString(L"临时车"); m_CarTypeComb.AddString(L"固定车"); m_CarTypeComb.SetCurSel(0); m_ChannelComb.AddString(L"所有"); m_ChannelComb.AddString(L"名诚大楼出口1"); m_ChannelComb.AddString(L"名诚大楼出口2"); m_MianFeiEdt.SetWindowText(L""); } void CReportView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); // TODO: add draw code here //以下为画工具条背景图片 CBitmap hbitmap; hbitmap.LoadBitmap(IDB_16TOOLBARBK); CDC Medc; Medc.CreateCompatibleDC(pDC); Medc.SelectObject(hbitmap); BITMAP bmp; hbitmap.GetBitmap(&bmp); CRect DrawRect; GetWindowRect(DrawRect); ScreenToClient(DrawRect); DrawRect.bottom = 26; pDC->StretchBlt(DrawRect.left,DrawRect.top,DrawRect.Width(),DrawRect.Height(),&Medc, 0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); CFont font; VERIFY(font.CreatePointFont(100, L"宋体", pDC)); CFont* def_font = pDC->SelectObject(&font); pDC->SetBkMode(TRANSPARENT); if(m_ReportType ==SHOW_REPORT_OPERATOR_FEE)//操作员收费查询报表 { pDC->TextOut(10,7,L"开始时间"); pDC->TextOut(235,7,L"结束时间"); pDC->TextOut(460,7,L"操作员"); pDC->TextOut(565,7,L"车类型"); pDC->TextOut(670,7,L"道口"); pDC->TextOut(805,7,L"免费大于"); } else { pDC->TextOut(10,7,L"排序字段"); pDC->TextOut(255,7,L"排序方式"); } pDC->SelectObject(def_font); font.DeleteObject(); } BOOL CReportView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default CBrush backBrush(RGB(200,220,255)); // 保存旧刷子 CBrush* pOldBrush = pDC->SelectObject(&backBrush); CRect rect; pDC->GetClipBox(&rect); // 擦除所需的区域 pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); pDC->SelectObject(pOldBrush); return TRUE; } 以上为刷新代码,onpaint没重载 程序运行后,在视图上点击时间控件或从下拉框中选择某项后,当鼠标移动到最后面的文本框上时,不知为何会在文本框的位置会显示时间控件或下拉框上的界面内容?![图片说明](https://img-ask.csdn.net/upload/201804/11/1523416826_921486.jpg)但当鼠标点击了文本框时,仍可在文本框中输入内容。
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
源码阅读(19):Java中主要的Map结构——HashMap容器(下1)
(接上文《源码阅读(18):Java中主要的Map结构——HashMap容器(中)》) 3.4.4、HashMap添加K-V键值对(红黑树方式) 上文我们介绍了在HashMap中table数组的某个索引位上,基于单向链表添加新的K-V键值对对象(HashMap.Node&lt;K, V&gt;类的实例),但是我们同时知道在某些的场景下,HashMap中table数据的某个索引位上,数据是按照红黑树
c++制作的植物大战僵尸,开源,一代二代结合游戏
    此游戏全部由本人自己制作完成。游戏大部分的素材来源于原版游戏素材,少部分搜集于网络,以及自己制作。 此游戏为同人游戏而且仅供学习交流使用,任何人未经授权,不得对本游戏进行更改、盗用等,否则后果自负。 目前有六种僵尸和六种植物,植物和僵尸的动画都是本人做的。qq:2117610943 开源代码下载 提取码:3vzm 点击下载--&gt; 11月28日 新增四种植物 统一植物画风,全部修
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
深度学习图像算法在内容安全领域的应用
互联网给人们生活带来便利的同时也隐含了大量不良信息,防范互联网平台有害内容传播引起了多方面的高度关注。本次演讲从技术层面分享网易易盾在内容安全领域的算法实践经验,包括深度学习图
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程实用技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法,并会持续更新。
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
"狗屁不通文章生成器"登顶GitHub热榜,分分钟写出万字形式主义大作
GitHub 被誉为全球最大的同性交友网站,……,陪伴我们已经走过 10+ 年时间,它托管了大量的软件代码,同时也承载了程序员无尽的欢乐。 万字申请,废话报告,魔幻形式主义大作怎么写?兄dei,狗屁不通文章生成器了解一下。这个富有灵魂的项目名吸引了众人的目光。项目仅仅诞生一周,便冲上了GitHub趋势榜榜首(Js中文网 -前端进阶资源教程)、是榜首哦
推荐几款比较实用的工具,网站
1.盘百度PanDownload 这个云盘工具是免费的,可以进行资源搜索,提速(偶尔会抽风????) 不要去某站买付费的???? PanDownload下载地址 2.BeJSON 这是一款拥有各种在线工具的网站,推荐它的主要原因是网站简洁,功能齐全,广告相比其他广告好太多了 bejson网站 3.二维码美化 这个网站的二维码美化很好看,网站界面也很...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
相关热词 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件 c#注册dll文件 c#安装.net
立即提问