MFC中 m_hBitmap!=0问题

图片说明
这个错误怎么解决啊,小白一只
求助各位大佬

2个回答

上代码啊。。。m_hBitmap 是怎么定义的。。。

我自己没有定义m_hBitmap,报错的时候有了,这个怎么解决啊,求教
头文件李定义了
public:
struct shero
{
CImage hero; //保存英雄的图像
int x; //保存英雄的位置
int y;
int direct; //英雄的方向
int frame; //运动到第几张图片
}MyHero;

CRect m_client;    //保存客户区大小
CImage m_bg;   //保存背景

CDC m_cacheDC;   //缓冲DC
CBitmap m_cacheCBitmap;//缓冲位图

cpp文件里

void CChildView::OnPaint()
{
//获取窗口DC指针
CDC *cDC=this->GetDC();
//获取窗口大小
GetClientRect(&m_client);
//创建缓冲DC
m_cacheDC.CreateCompatibleDC(NULL);
m_cacheCBitmap.CreateCompatibleBitmap(cDC, m_client.Width(), m_client.Height());
m_cacheDC.SelectObject(&m_cacheCBitmap);
//贴背景
m_bg.Draw(m_cacheDC, m_client);
//贴英雄
MyHero.hero.Draw(m_cacheDC, MyHero.x, MyHero.y, 80, 80, MyHero.frame * 80, MyHero.direct * 80, 80, 80);
//将缓冲DC内容输出到窗口DC中
cDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), &m_cacheDC, 0, 0, SRCCOPY);

//————————————————————绘制结束—————————————————————

//在绘制完图后,使窗口区有效
ValidateRect(&m_client);
//释放缓冲DC
DeleteDC(m_cacheDC);
//释放对象
DeleteObject(m_cacheCBitmap);
//释放窗口DC
ReleaseDC(cDC);

}


Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MFC CBitmap 和 HBITMAP 析构问题
我在一个dialog里面用CImageList加载多个.bmp格式位图。 1 我定义了一个HBITMAP hBitmapHouse 变量,CBitmap pBitmapHouse[9]数组; 在for循环里面LoadImage不同的图片 代码如下: for(i = 0; i < 9; i++) { tempFileName = "res/dockhouse" + to_string(i) + ".bmp"; hBitmapHouse = (HBITMAP)LoadImage(AfxGetInstanceHandle(),tempFileName.c_str(), IMAGE_BITMAP,0,0,LR_LOADFROMFILE); pBitmapHouse[i].Attach(hBitmapHouse); m_ImgHouse.Add(&pBitmapHouse[i],RGB(0,0,0)); } m_ImgHouse 是dialog的一个成员。 问题一: 这个hBitmapHouse变量循环一次,指向新的内存。pBitmapHouse执行析构的时候,会把相应的图片的内存会释放掉吗? 问题二:我是在initdialog这个函数里面定义的pBitmapHouse这个变量,它在这个函数结束的时候要执行析构函数,我没有detach, pBitmapHouse应该会把自己的对象和它对应的图片的内存都释放掉, 为什么我的dialog还是正常显示图片? 问题三:我是不是应该在这个dialog类里面定义CBitmap数组,在这个initdialog里面用一个hBitmapHouse,来加载不同的图片,等到这个对话框析构的时候,会自动调用CBitmap,这样,图片和CBitmap对象都释放掉了?
MFC 位图画到 picture
CString strPath,strPname; CString strSql; strSql.Format("select * from File_info where F_id = '%s'",id); CADORecordset Rs(&CTicketSystem11App::m_DB); Rs.Open((LPCTSTR)strSql); Rs.GetFieldValue("F_path",strPath); Rs.GetFieldValue("F_mpname",strPname); CRect rect; GetClientRect(&rect); CDC *pDc=GetDlgItem(IDC_STATIC_PIC)->GetDC();//得到dc HBITMAP m_hBitmap=(HBITMAP)::LoadImage(NULL,strPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); CBitmap m_Bitmap; m_Bitmap.Attach(m_hBitmap);//将加载进来的图像与位图相联系 CDC MemDc; MemDc.CreateCompatibleDC(pDc); MemDc.SelectObject(&m_Bitmap); pDc->BitBlt(0,0,rect.Width(),rect.Height(),&MemDc,0,0,SRCCOPY); ![图片说明](https://img-ask.csdn.net/upload/201705/19/1495207079_747750.png) ![图片说明](https://img-ask.csdn.net/upload/201705/19/1495207090_744866.png) 点击图1修改按钮在图二上面显示图片,图片名称和路径在数据库中。 好像有问题,位图名称都没有输,求指导。。
MFC动态加载图片失败,HBITMAP创建不正确
__在下图所示的Picture__Control中动态加入位图,位图文件位置保存在szBMP0(CString)中,Picture控件中创建m_PIC_BMP0变量,但是图片无法加载,加载图片的句柄显示CXX0030无法计算的表达式,加载图片失败,请大神解答~谢谢!__[窗口图片说明](https://img-ask.csdn.net/upload/201505/05/1430827789_554069.png)![图片说明](https://img-ask.csdn.net/upload/201505/05/1430827873_108600.png)!![图片说明](https://img-ask.csdn.net/upload/201505/05/1430827889_548273.png)
MFC屏幕监控程序中 CPaintDC dc(this)运行出错
在屏幕监控程序中,收到BITMAPINFO调色板信息后,代码如下: ``` m_hDC = ::GetDC(m_hWnd); m_hMemDC = CreateCompatibleDC(m_hDC); m_hFullBitmap = NULL; LPVOID m_lpScreenDIB = NULL; //CreateDIBSection运行后提示0x00000008not enough storage is availabke to process this command m_hFullBitmap = CreateDIBSection(m_hDC, m_lpbmi, DIB_RGB_COLORS, &m_lpScreenDIB, NULL, NULL); (HBITMAP)SelectObject(m_hMemDC, m_hFullBitmap); ``` 当收到传过来的屏幕信息后: ``` memcpy(m_lpScreenDIB, recvbuf, m_lpbmi->bmiHeader.biSizeImage); OnPaint(); ``` Debug运行到OnPaint()中的CPaintDC dc(this)这句时弹框提示unhandle exception in exe:0xC0000005:Access violation。程序定位到m_pHashTable == NULL这一句,如下: ``` void* CMapPtrToPtr::GetValueAt(void* key) const // find value (or return NULL -- NULL values not different as a result) { if (m_pHashTable == NULL) return NULL; ...... ``` Release方式运行时,第一次运行没问题,第二次程序就崩溃,一直找不到问题所在,大家帮忙看看
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)但当鼠标点击了文本框时,仍可在文本框中输入内容。
MFC使用CMemory封装类来实现透明位图出错
问题描述: 想要实现的效果是在屏幕出现一只飞舞的蝴蝶(带有透明色背景位图),使用了CMemory封装类 来实现,虽然可以使蝴蝶飞动,但最终蝴蝶图片的背景还是没有去除掉, Memory.h头文件 ``` #pragma once #include "afxwin.h" #ifndef __MEMDC_H__ #define __MEMDC_H__ class CMemoryDC :public CDC { CSize m_size; public: void BitTrans( int nXDest, // 目标起点X int nYDest, // 目标起点Y int nWidthDest, // 目标宽度 int nHeightDest,// 目标高度 CDC* pDC, // 目标DC int nXSrc, // 来源起点X int nYSrc, // 来源起点Y COLORREF crTrans// 透明色 ) { CMemoryDC dcImage(nWidthDest, nHeightDest, pDC);//临时DC CBitmap bmpMask; bmpMask.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图 CDC dcMask;//掩码DC dcMask.CreateCompatibleDC(pDC); dcMask.SelectObject(bmpMask); //将载入位图的内存DC中的位图,拷贝到临时DC中 dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, SRCCOPY); // 设置临时DC的透明色 dcImage.SetBkColor(crTrans); //掩码DC的透明区域为白色其它区域为黑色 dcMask.BitBlt(0, 0, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCCOPY); //临时DC透明区域为黑色,其它区域保持不变 dcImage.SetBkColor(RGB(0, 0, 0)); dcImage.SetTextColor(RGB(255, 255, 255)); dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND); // 目标DC透明部分保持屏幕不变,其它部分变成黑色 pDC->SetBkColor(RGB(255, 255, 255)); pDC->SetTextColor(RGB(0, 0, 0)); pDC->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND); pDC->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCPAINT); } void StretchTrans( int nXDest, // 目标起点X int nYDest, // 目标起点Y int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 CDC* pDC, // 目标DC int nXSrc, // 来源起点X int nYSrc, // 来源起点Y int nWidthSrc, // 来源宽度 int nHeightSrc, // 来源高度 COLORREF crTrans // 透明色 ) { CMemoryDC dcImage(nWidthDest, nHeightDest, pDC);//临时DC CBitmap bmpMask; // 创建单色掩码位图 bmpMask.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); CDC dcMask; dcMask.CreateCompatibleDC(pDC); dcMask.SelectObject(bmpMask); // 将载入位图的内存DC中的位图,拷贝到临时DC中 if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc) dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, SRCCOPY); else dcImage.StretchBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, nWidthSrc, nHeightSrc, SRCCOPY); // 设置临时DC的透明色 dcImage.SetBkColor(crTrans); //掩码DC的透明区域为白色其它区域为黑色 dcMask.BitBlt(0, 0, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCCOPY); //临时DC透明区域为黑色,其它区域保持不变 dcImage.SetBkColor(RGB(0, 0, 0)); dcImage.SetTextColor(RGB(255, 255, 255)); dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND); // 目标DC透明部分保持屏幕不变,其它部分变成黑色 pDC->SetBkColor(RGB(255, 255, 255)); pDC->SetTextColor(RGB(0, 0, 0)); pDC->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND); pDC->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCPAINT); } CMemoryDC() { m_size.cx = m_size.cy = 0; } //从资源中加载位图 BOOL LoadBitmap(UINT nBitmapID, CDC* pDC = NULL) { CBitmap bitmap; bitmap.LoadBitmap(nBitmapID); BITMAP bm; bitmap.GetBitmap(&bm); m_size.cx = bm.bmWidth; m_size.cy = bm.bmHeight; CreateCompatibleDC(pDC); SelectObject(bitmap); return TRUE; } CMemoryDC(UINT nBitmapID, CDC* pDC = NULL) { LoadBitmap(nBitmapID, pDC); } //从.bmp文件中加载位图 BOOL LoadBitmap(LPCTSTR szBitmapFile, CDC* pDC = NULL) { HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), szBitmapFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); BITMAP bm; GetObject(hBitmap, sizeof(bm), &bm); m_size.cx = bm.bmWidth; m_size.cy = bm.bmHeight; CreateCompatibleDC(pDC); SelectObject(hBitmap); return TRUE; } CMemoryDC(LPCTSTR szBitmapFile, CDC* pDC = NULL) { LoadBitmap(szBitmapFile, pDC); } //创建一张空白内存画布 BOOL Create(int cx, int cy, CDC* pDC = NULL) { CreateCompatibleDC(pDC); CBitmap bitmap; if (pDC) bitmap.CreateCompatibleBitmap(pDC, cx, cy); else bitmap.CreateCompatibleBitmap(&CClientDC(NULL), cx, cy); m_size.cx = cx; m_size.cy = cy; SelectObject(bitmap); return TRUE; } CMemoryDC(int cx, int cy, CDC* pDC = NULL) { Create(cx, cy, pDC); } //摧毁 BOOL DeleteDC() { if (!GetSafeHdc()) return TRUE; CBitmap * pBitmap = GetCurrentBitmap(); pBitmap->DeleteObject(); return CDC::DeleteDC(); } ~CMemoryDC() { DeleteDC(); } inline int Width() { return m_size.cx; } inline int Height() { return m_size.cy; } void CMemoryDC::BitRgn(CRgn &rgn,/*目标区域*/COLORREF crTrans/*透明色*/) { //根据当前位图和透明色生成一个不规则区域 int i = 0, j = 0; rgn.CreateRectRgn(0, 0, 0, 0); while (i < m_size.cx) { j = 0; while (j < m_size.cy) { if (GetPixel(i, j) - crTrans) { //如果不是透明色就在区域内增加一个点 CRgn r; r.CreateRectRgn(i, j, i + 1, j + 1); rgn.CombineRgn(&rgn, &r, RGN_OR); } ++j; } ++i; } } }; \#endif //__MEMDC_H__ ``` 主对话框头文件:FlyRgnDlg.h ``` // FlyRgnDlg.h : header file // #pragma once #include "MemDC.h" // CFlyRgnDlg dialog class CFlyRgnDlg : public CDialogEx { // Construction public: enum { FLY_CNT = 7 }; CMemoryDC m_dc[FLY_CNT]; CRgn m_rgn[FLY_CNT]; int m_nIndex; //当前帧数 CPoint m_pos; //当前位置 public: CFlyRgnDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data #ifdef AFX_DESIGN_TIME enum { IDD = IDD_FLYRGN_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: HICON m_hIcon; // Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnTimer(UINT_PTR nIDEvent); void OnDraw(CDC* pDC); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnNcPaint(); }; ``` 主对话框cpp文件:FlyRgnDlg.cpp ``` // FlyRgnDlg.cpp : implementation file // #include "stdafx.h" #include "FlyRgn.h" #include "FlyRgnDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CFlyRgnDlg dialog #define TRANSCOLOR RGB(0,0,0) CFlyRgnDlg::CFlyRgnDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_FLYRGN_DIALOG, pParent) { m_nIndex = 0; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CFlyRgnDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CFlyRgnDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_TIMER() ON_WM_ERASEBKGND() ON_WM_NCPAINT() END_MESSAGE_MAP() // CFlyRgnDlg message handlers BOOL CFlyRgnDlg::OnInitDialog() { CDialogEx::OnInitDialog(); int i = 0; CString str; while (i < FLY_CNT) { //加载多张动画图片并且每张图片根据透明色区域生成一个区域 str.Format(_TEXT("./flys/%03d.bmp"), i + 1); m_dc[i].LoadBitmapW(str); m_dc[i].BitRgn(m_rgn[i], TRANSCOLOR); i++; } ModifyStyle(GetStyle(), 0);//去掉标题栏和边框 ModifyStyleEx(GetExStyle(), WS_EX_TOOLWINDOW);//不在任务栏显示 //创建一个屏幕随机坐标 int cx = GetSystemMetrics(SM_CXSCREEN); int cy = GetSystemMetrics(SM_CYSCREEN); srand(time(NULL)); m_pos.x = rand() % (cx - m_dc[0].Width()); m_pos.y = rand() % (cy - m_dc[0].Height()); CMemoryDC &mdc = m_dc[m_nIndex];//设置窗口位置并置顶 SetWindowPos(&wndTopMost, m_pos.x, m_pos.y, mdc.Width(), mdc.Height(), 0); CRgn rgn; //选择一个帧区域复制后设置到窗口 rgn.CreateRectRgn(0, 0, 0, 0); rgn.CopyRgn(&m_rgn[m_nIndex]); SetWindowRgn(rgn, TRUE); //启动定时器 SetTimer(0, 64, NULL); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CFlyRgnDlg::OnPaint() { CPaintDC dc(this); OnDraw(&dc); } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CFlyRgnDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CFlyRgnDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: Add your message handler code here and/or call default /* CmemoryDC &mdc = m_dc[m_nIndex]; MoveWindow(m_pos.x, m_pos.y, mdc.GetWidth(), mdc.GetHeight()); CRgn rgn; rgn.CreateRectRgn(0, 0, 0, 0); rgn.CopyRgn(&m_rgn[m_nIndex]); SetWindowRgn(rgn, TRUE); CClientDC dc(this); mdc.BitTrans(0, 0, mdc.GetWidth(), mdc.GetHeight(), &dc, 0, 0, SRCCOPY); static int cx = 5, cy = 5; m_pos.Offset(cx, cy); if (m_pos.x + mdc.GetWidth() > GetSystemMetrics(SM_CXSCREEN) || m_pos.x < 0) cx *= -1; if (m_pos.y + mdc.GetHeight() > GetSystemMetrics(SM_CYSCREEN) || m_pos.y < 0) cy *= -1; if (++m_nIndex >= FLY_CNT) m_nIndex = 0;*/ CClientDC dc(this); Invalidate(FALSE); CDialogEx::OnTimer(nIDEvent); } void CFlyRgnDlg::OnDraw(CDC *pDC) { CMemoryDC &mdc = m_dc[m_nIndex]; MoveWindow(m_pos.x, m_pos.y, mdc.Width(), mdc.Height()); CRgn rgn; rgn.CreateRectRgn(0, 0, 0, 0); rgn.CopyRgn(&m_rgn[m_nIndex]); SetWindowRgn(rgn, TRUE); mdc.BitTrans(0, 0, mdc.Width(), mdc.Height(), pDC, 0, 0, TRANSCOLOR); static int cx = 5, cy = 5; m_pos.Offset(cx, cy); if (m_pos.x + mdc.Width() > GetSystemMetrics(SM_CXSCREEN) || m_pos.x < 0) cx *= -1; if (m_pos.y + mdc.Height() > GetSystemMetrics(SM_CYSCREEN) || m_pos.y < 0) cy *= -1; if (++m_nIndex >= FLY_CNT) m_nIndex = 0; } BOOL CFlyRgnDlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; // return CDialogEx::OnEraseBkgnd(pDC); } void CFlyRgnDlg::OnNcPaint() { // TODO: Add your message handler code here // Do not call CDialogEx::OnNcPaint() for painting messages } ``` ![失败的效果](https://img-ask.csdn.net/upload/201708/16/1502854706_811662.png)
吕鑫老师的MFC透明动画技术为什么我实现不了
这是吕鑫老师CMemDC的封装类,可以用来实现图片的背景透明,但是我却实现不了,请大神看看因为什么,我用的是vs2010版本。 ``` #pragma once #include <afxwin.h> class CGMemDC :public CDC { CSize m_size; public: CGMemDC(void) { m_size.cx = m_size.cy = 0; } BOOL LoadBitmap(UINT nBitmapID, CDC * pDC=NULL) { CBitmap bitmap; bitmap.LoadBitmapW(nBitmapID); BITMAP bm; bitmap.GetBitmap(&bm); m_size.cx = bm.bmWidth; m_size.cy = bm.bmHeight; CreateCompatibleDC(pDC); SelectObject(bitmap); return true; } CGMemDC(UINT nBitmapID, CDC * pDC=NULL) { LoadBitmap(nBitmapID,pDC); } BOOL LoadBitmap(LPCWSTR szBitmapFile, CDC * pDC=NULL) { HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),szBitmapFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); BITMAP bm; GetObject(hBitmap,sizeof(bm),&bm); m_size.cx = bm.bmWidth; m_size.cy = bm.bmHeight; CreateCompatibleDC(pDC); SelectObject(hBitmap); return true; } CGMemDC(LPCWSTR szBitmapFile, CDC* pDC=NULL) { LoadBitmap(szBitmapFile,pDC); } BOOL Create(int cx, int cy, CDC* pDC=NULL) { CBitmap bitmap; bitmap.CreateCompatibleBitmap(pDC,cx,cy); m_size.cx = cx; m_size.cy = cy; CreateCompatibleDC(pDC); SelectObject(bitmap); return true; } CGMemDC(int cx, int cy, CDC* pDC=NULL) { Create(cx,cy,pDC); } BOOL DeleteDC(void) { if(!GetSafeHdc()) return true; CBitmap *pBitmap = GetCurrentBitmap(); pBitmap->DeleteObject(); return CDC::DeleteDC(); } ~CGMemDC(void) { DeleteDC(); } inline int Width() { return m_size.cx; } inline int Height() { return m_size.cy; } /////增加显示透明位图的代码 void BitTrans( int nXDest, int nYDest, int nWidthDest, int nHeightDest, CDC * pDC, int nXSrc, int nYSrc, COLORREF crTrans) { CGMemDC dcImage(nWidthDest,nHeightDest,pDC); CBitmap bmpMask; bmpMask.CreateBitmap(nWidthDest,nHeightDest,1,1,NULL); CDC dcMask; dcMask.CreateCompatibleDC(pDC); dcMask.SelectObject(bmpMask); dcImage.BitBlt(0,0,nWidthDest,nHeightDest,this,nXSrc,nYSrc,SRCCOPY); dcImage.SetBkColor(crTrans); dcMask.BitBlt(0,0,nWidthDest,nHeightDest,&dcImage,0,0,SRCCOPY); dcImage.SetBkColor(RGB(0,0,0)); dcImage.SetTextColor(RGB(255,255,255)); dcImage.BitBlt(0,0,nWidthDest,nHeightDest,&dcMask,0,0,SRCAND); pDC->SetBkColor(RGB(255,255,255)); pDC->SetTextColor(RGB(0,0,0)); pDC->BitBlt(nXDest,nYDest,nWidthDest,nHeightDest,&dcMask,0,0,SRCAND); pDC->BitBlt(nXDest,nYDest,nWidthDest,nHeightDest,&dcImage,0,0,SRCPAINT); } }; ``` ``` #include "GMemDC.h" // CTrans 对话框 class CTrans : public CDialogEx { CGMemDC m_dc; ``` dc.BitBlt函数是将原图输出,dc.BitTrans是透明输出,敲得代码跟书上一样,但是我的却没有实现,是因为版本不一样吗? ``` void CTrans::OnPaint() { CPaintDC dc(this); // device context for painting if(!m_dc) m_dc.LoadBitmapW(IDB_BITMAP3); dc.BitBlt(0,0,m_dc.Width(),m_dc.Height(),&m_dc,0,0,SRCCOPY); m_dc.BitTrans(m_dc.Width(),0,m_dc.Width(),m_dc.Height(),&dc,0,0,RGB(255,0,255)); } ```
MFC做一个截屏程序,保存到剪切板后怎么打开这个图
我在做一个MFC截图,不知道代码是否有错,估计没错,现在的疑问是如果代码没错的话,截完图保存到剪切板了,然后到哪里打开这个图 void C截图Dlg::GetScreenCapture() { //桌面窗口的设备上下文DC//画布 HDC hDesktopDC = ::CreateDC(_T("DISPLAY"),NULL,NULL,NULL); //加::指出是API函数调用,不是成员函数调用 HDC hMemDC = ::CreateCompatibleDC(hDesktopDC); //创建一个空白位图 HBITMAP hBmp,hOldBmp; int iWidth = abs(m_tEndpt.x-m_tBeginPt.x); int iHeight = abs(m_tEndpt.y-m_tBeginPt.y); hBmp = ::CreateCompatibleBitmap(hDesktopDC,iWidth,iHeight); //把位图放到内存DC hOldBmp = (HBITMAP)::SelectObject(hMemDC,hBmp); //把截图区域拷贝到内存DC POINT pt =m_tBeginPt; ClientToScreen(&pt);//把窗口客户区的相对坐标点转化为桌面屏幕坐标点 //把选定的桌面区域拷贝到内存DC ::BitBlt(hMemDC,0,0,iWidth,iHeight,hDesktopDC,pt.x,pt.y,SRCCOPY); //把旧的设备位图设置回去 hBmp = (HBITMAP)SelectObject(hMemDC,hBmp); //释放 DeleteDC(hMemDC); DeleteDC(hDesktopDC); //把位图保存到剪切板 if(OpenClipboard())//打开剪切板 { EmptyClipboard();//清空剪切板 SetClipboardData(CF_BITMAP,hBmp); CloseClipboard(); MessageBox(L"fsg"); } DeleteObject(hBmp); DeleteObject(hMemDC); DeleteObject(hDesktopDC); }
xp系统下按钮图片显示有误 是什么情况
MFC 给按钮加载一个本地图片 在XP体统中显示有差别 应该怎么办呢 创建方式 CString strDoor=L"BTN_Length.bmp"; CString strFile; strFile.Format(L"%s\\%s", g_tool.m_strModuleDir, strDoor); HBITMAP hbitmap=(HBITMAP)::LoadImage(NULL,(LPCTSTR)strFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //GetDlgItem( IDC_BUTTON4)->SetBitmap(hbitmap); m_RoomLengthButtun.SetBitmap(hbitmap); win 7 ![图片说明](https://img-ask.csdn.net/upload/201610/18/1476785715_553132.png) xP ![图片说明](https://img-ask.csdn.net/upload/201610/18/1476785733_99371.png)
MFC使用CImage加载图像失败
MFC使用CImage加载图像,使用同样的方法,有的图片能够成功有的失败,线是代码,请大家指教。图片大小都小于1M。 void CFastSetDlg::OnBnClickedButton3() { CImage img; if(!img.IsNull()) img.Destroy(); img.Load(_T("D:\\RobotSoft\\GENTEC_Simulation\\GENTEC_Simulation\\res\\Step.bmp")); if(!img.IsNull()) { HBITMAP hBmp = img.Detach(); m_btFastSet[4].SetBitmaps(hBmp,RGB(180, 180, 180)); m_btFastSet[4].Invalidate(); } } 加载成功图片![图片说明](https://img-ask.csdn.net/upload/201511/23/1448251523_507551.png) 加载失败图片![图片说明](https://img-ask.csdn.net/upload/201511/23/1448251545_452501.png)
MFC OnClickedbutton 求帮助。。。
MFC编程控制一台仪器,单击按钮的响应事件里面添加了两个操作。一个事操作仪器,第二个是截取操作后的仪器屏幕截图并保存在目录中随后显示在客户区。我设置了多个按钮,但我运行后发现单击按钮一次只能实现操作仪器,需要再单击一次按钮才能截图并显示。 MemDC =CreateCompatibleDC(0);//得到一个兼容设备句柄 HBITMAP bit;//一个位图 CString cc; cc="buf.bmp";//图片名称 要放到当前目录 bit=(HBITMAP)LoadImage(AfxGetInstanceHandle(),cc,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//导入图片 SelectObject(MemDC,bit);//把图片选择设备 CClientDC dc(this);//取得dc BitBlt(dc.m_hDC,185,177,400,300,MemDC,0,0,SRCCOPY); viClose (vi); viClose (defaultRM); 这是我用来显示图片的方法。就是图片显示有迟疑。需要单击两次按钮。
OpenGL在64位计算机上无法以bmp方式拷贝绘制的图形?
大家好, 本人项目中采用VS2013+OpenGL绘图并对图形进行拷贝,测试程序为一个基于对话框的工程,在主对话框中有一个自定义控件用于绘图,该控件旁边有一个按钮控件Copy,其响应函数OnBnClickedButtonCopy()中对自定义控件中的图形做拷贝。 自定义控件CGraphCtrl中的OnPaint函数如下: void CGraphCtrl::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 //MFC绘图 CRect rc; GetClientRect(&rc); dc.MoveTo(0, 0); dc.LineTo(rc.right, rc.bottom); dc.MoveTo(rc.right, 0); dc.LineTo(0, rc.bottom); //OpenGL绘图 wglMakeCurrent(m_hDC, m_hRC); DrawGraph(); SwapBuffers(m_hDC); wglMakeCurrent(m_hDC, NULL); } 主对话框按钮控件Copy的响应函数如下: void CUsingGlut32Dlg::OnBnClickedButtonCopy() { //m_GraphCtrl.WriteBmpToFile(hBitmap, _T("WriteBmpToFile.bmp")); HBITMAP hBitmap = m_GraphCtrl.GetBmpHandle(); m_GraphCtrl.CopyBmpToClipBoard(hBitmap); } 下面为该程序在win10 64位机器上的运行效果和点击按钮Copy后剪贴板中的内容: ![图片说明](https://img-ask.csdn.net/upload/201605/27/1464314555_824925.png) ![图片说明](https://img-ask.csdn.net/upload/201605/27/1464314572_576558.png) 该程序在win7 32位机器上运行正常,即点击Copy后剪贴板中的内容与界面显示的相同。 上述问题很让人难以理解,程序在64位计算机上运行时,DC所绘内容在哪儿?RC所绘内容与DC不在同一个缓存里?希望那位老师或大侠能给出解释和解决方案。非常感谢!
在MFC透明窗口(layer window)中,如何设定光标?
先概述一下,现在做一个项目,需要用一个windowless richedit 做一个文本框,然后实现文本框的编辑功能。由于某种原因,我需要将文本框的窗口设定为透明的。这样,就面对了一个问题,就是要在编辑状态下实现透明窗口光标的显示(以及其他功能,暂且不述),因为编辑状态如果连光标都无法显示编辑就无从谈起。现在所面对的问题是,我无法在透明窗口上显示光标。 下面详细的说一下问题的程序建立的步骤,我分析问题更多与透明窗口有关系,而与windowless richedit的关系不大,所以windowless richedit的建立和销毁等叙述会比较简单: 1 先建立一个MFC的对话框类,在该对话框类的构造函数中,获得windowless richedit中的ITextHost、ITextServices和ITextDocument指针。 2 在对话框的OnInitDialog()中,完成下列功能: (1) 设定窗口layer属性,设定的代码如下: SetWindowLong(this->m_hWnd, GWL_EXSTYLE, GetWindowLong(this->m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE); 通过上面的语句,将对话框窗口设定成了layer窗口。实现了透明效果。 (2)为windowless richedit添加文字。代码不表了。 3 在重绘函数OnPaint()中,用UpdateLayeredWindow将文本框的内容显示出来。步骤如下: (1) 建立一个32位的bitmap位图,然后将其数据全部清零。(从而alpha值也为零了) (2) 通过上面建立的bitmap位图,建立一个和对话框dc相兼容的hdc。 (3) 调用windowless richedit的绘制函数将文本框内容绘制到兼容hdc中。 (4) 用UpdateLayeredWindow函数将本文框框内容绘制到当前的对话框窗口中。 这段代码后面会给出。 4 在对话框中重写了virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);函数,目的是为了在对话框中,自己处理一些消息。处理的代码如下: if ( (WM_MOUSEFIRST <= message && message <= WM_MOUSELAST) || (message == WM_SETFOCUS)) { CreateSolidCaret (100, 100); SetCaretPos (CPoint(120,60)); ShowCaret(); //delete pBitmap; return CDialog::WindowProc(message, wParam,lParam); } else return CDialog::WindowProc(message, wParam,lParam); 代码写的不太好,就是测试代码,这个代码完成的功能是:如果是与鼠标相关的消息或者是激活消息。则通过MFC封装函数建立光标,设定光标位置 并显示出来。 5 完成了以上几步后,我认为光标就应该在希望的位置显示了,然而遗憾的是,没有显示出来。但是在下面两种情况下,就可以显示。 1 不在将对话框设定为layer属性,也就是说,采用普通窗口,然后在调用windowless richedit框的绘制函数中,直接传入对话框的hdc,这时候,就可以正确的显示设定的光标。 2 如果在对话框的OnInitDialog()中,在指定windows的layer属性之后,添加 SetLayeredWindowAttributes(cKey.ToCOLORREF(), 150, LWA_ALPHA);这个语句,则可以显示光标。当然,参数不是唯一的,而且也不一定非得alpha模式,color key模式也可以显示光标。比如:SetLayeredWindowAttributes(cKey.ToCOLORREF(), 150, LWA_COLORKEY); 现在的疑问是:为什么不指定layer窗口,或者用SetLayeredWindowAttributes规范一下透明窗口,就可以将光标显示出来了?为什么用UpdateLayeredWindow就无法显示呢? 现在给出用UpdateLayeredWindow显示文本的代码。 void CRichDrawExampleDlg::OnPaintRectLayer(RectF& invalidateRect,CDC& dc ) { CRect rct; ::GetWindowRect( m_hWnd, &rct ); BITMAPINFOHEADER bmih; ZeroMemory( &bmih, sizeof( BITMAPINFOHEADER ) ); bmih.biSize = sizeof( BITMAPINFOHEADER ); bmih.biWidth = rct.Width(); bmih.biHeight = - rct.Height(); bmih.biPlanes = 1 ; bmih.biBitCount = 32;//这里一定要是 bmih.biCompression = BI_RGB; bmih.biSizeImage = 0 ; bmih.biXPelsPerMeter = 0 ; bmih.biYPelsPerMeter = 0 ; bmih.biClrUsed = 0 ; bmih.biClrImportant = 0 ; int iBPP = GetDeviceCaps(dc.GetSafeHdc(), BITSPIXEL ); HDC hdcMemory1 = CreateCompatibleDC( dc.GetSafeHdc()); BYTE *dst = NULL; HBITMAP hBitMap1 = CreateDIBSection(dc.GetSafeHdc(),( BITMAPINFO* )&bmih, DIB_RGB_COLORS, ( VOID** )&dst, NULL, 0 ); memset( dst, 0, rct.Height() * rct.Width() * 4 ); SelectObject( hdcMemory1, hBitMap1 ); CRect rect = RectFToCRect(invalidateRect); m_RichText.DrawText(hdcMemory1,rect,this); //if( iBPP != 32 ) { HDC hdcMemory2 = CreateCompatibleDC( dc.GetSafeHdc() ); BYTE *dstW = NULL; HBITMAP hBitMap2 = CreateDIBSection( dc.GetSafeHdc(), ( BITMAPINFO* )&bmih, DIB_RGB_COLORS, ( VOID** )&dstW, NULL, 0 ); memset( dstW, 254, rct.Height() * rct.Width() * 4 ); SelectObject( hdcMemory2, hBitMap2 ); m_RichText.DrawText(hdcMemory2,rect,this); BYTE r, g, b, a, rw, gw, bw, aw, alpha_r, alpha_g, alpha_b, alpha; for (int y = 0; y < rct.Height() ; y++) { for (int x = 0; x < rct.Width(); x++) { //the idea is that we draw the same data onto black and white DC's //and then calculate per pixel alpha based on difference, produced by alpha blending r = *dst++; g = *dst++; b = *dst++; a = *dst++; rw = *dstW++; gw = *dstW++; bw = *dstW++; aw = *dstW++; alpha_r = rw-r; alpha_g = gw-g; alpha_b = bw-b; //division by 3 is for accuracy and can be replaced by //alpha = alpha_g; for example alpha = (alpha_r + alpha_g + alpha_b) / 3; *(dst - 1) = 255 - alpha; //this algorithm should be optimized for MMX to achieve best performance } } DeleteObject( hBitMap2 ); DeleteDC( hdcMemory2 ); } //for (int i = 0 ; i < rct.Height(); ++i) //{ // for (int j = 0; j < rct.Width(); ++j) // { // if (0 != *(dst + i * 4 * rct.Height() + 4 * j) || 0 != *(dst + i * 4 * rct.Height() + 4 * j + 1) || 0 != *(dst + i * 4 * rct.Height() + 4 * j + 2)) // { // *(dst + i * 4 * rct.Height() + 4 * j + 3) = 200; // } // } //} BLENDFUNCTION oBlend; oBlend.BlendOp = 0; //theonlyBlendOpdefinedinWindows2000 oBlend.BlendFlags = 0; //nothingelseisspecial... oBlend.SourceConstantAlpha = 255;//0~255//AC_SRC_ALPHA oBlend.AlphaFormat = 1; //... POINT ptSrc = { 0, 0 }; POINT ptWinPos = { rct.left, rct.top }; SIZE sizeWindow = { rct.Width(), rct.Height() }; ::UpdateLayeredWindow( m_hWnd, dc.GetSafeHdc(), &ptWinPos, &sizeWindow, hdcMemory1, &ptSrc, RGB( 0,0,0 ), &oBlend, ULW_ALPHA ); DeleteObject( hBitMap1 ); DeleteDC( hdcMemory1 ); } 谢谢您的查看!希望大家能帮一下,目前很困惑。
OpenGL绘图在32位和64位机器上的疑惑
大家好, 本人项目中采用VS2013+OpenGL绘图并对图形进行拷贝,先前一直在win7 32位机器上编写程序,前段时间将编写好的程序拷贝至win10 64位机器上,发现图形能够正常显示,但拷贝功能出现了问题,几经调试也无法解决。下面是以一个简单的测试程序描述该问题。 测试程序为一个基于对话框的工程,在主对话框中有一个自定义控件用于绘图,该控件旁边有一个按钮控件Copy,其响应函数OnBnClickedButtonCopy()中对自定义控件中的图形做拷贝。自定义控件CGraphCtrl中的OnPaint函数如下: void CGraphCtrl::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 //MFC绘图 CRect rc; GetClientRect(&rc); dc.MoveTo(0, 0); dc.LineTo(rc.right, rc.bottom); dc.MoveTo(rc.right, 0); dc.LineTo(0, rc.bottom); //OpenGL绘图 wglMakeCurrent(m_hDC, m_hRC); DrawGraph(); SwapBuffers(m_hDC); wglMakeCurrent(m_hDC, NULL); } 主对话框按钮控件Copy的响应函数如下: void CUsingGlut32Dlg::OnBnClickedButtonCopy() { //m_GraphCtrl.WriteBmpToFile(hBitmap, _T("WriteBmpToFile.bmp")); HBITMAP hBitmap = m_GraphCtrl.GetBmpHandle(); m_GraphCtrl.CopyBmpToClipBoard(hBitmap); } 下面图形分别为程序在win7 32位机器上的运行效果和点击按钮Copy后剪贴板中的内容: ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464225417_373890.png) ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464225551_446684.png) 运行效果和拷贝都与期望相同。 下面为该程序在win10 64位机器上的运行效果和点击按钮Copy后剪贴板中的内容: ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464225594_750790.png) ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464225641_235376.png) 运行效果相同,但拷贝似乎只针对MFC绘图部分,而没有拷贝OpenGL所绘制的内容。 下面将程序中MFC绘图部分和OpenGL绘图部分的代码顺序做了交换,如下所示: void CGraphCtrl::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 //OpenGL绘图 wglMakeCurrent(m_hDC, m_hRC); DrawGraph(); SwapBuffers(m_hDC); wglMakeCurrent(m_hDC, NULL); //MFC绘图 CRect rc; GetClientRect(&rc); dc.MoveTo(0, 0); dc.LineTo(rc.right, rc.bottom); dc.MoveTo(rc.right, 0); dc.LineTo(0, rc.bottom); } 这次,程序在win7 32位机器上的运行效果和点击按钮Copy后剪贴板中的内容如下: ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464226013_720590.png) ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464226057_333525.png) 运行效果和拷贝也都与期望相同。 下面为该程序在win10 64位机器上的运行效果和点击按钮Copy后剪贴板中的内容: ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464226145_869143.png) ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464226196_96484.png) 运行效果没有显示OpenGL的内容,而且拷贝也是只针对MFC绘图部分,没有拷贝OpenGL所绘制的内容。 上述问题很让人难以理解,DC所绘内容在哪儿?RC所绘内容与DC不在同一个缓存里?显示的是后半段缓存里的内容,拷贝的是前半段缓存里的内容?OpenGL绘图结束后,调用SwapBuffers函数后,前后台缓存应该做了交换啊!难道是内存错位问题?OpenGL不兼容64位?希望那位老师或大侠能给出解释和解决方案。非常感谢!
怎样将bmp图片放入CRichEditCtrl
最近在做MFC的IM类程序开发,有一个CRichEditCtrl控件用来发消息,现在想把CBitmap图片放入到这个控件中,网上试了好多代码都不行,希望指导一下 //将图片放在richedit中 void BugReportDialog::InsertPicToRichEdit(HBITMAP hbitmap) { HBITMAP bmp = hbitmap; //创建HBITMAP //bmp = (HBITMAP)::LoadImage(NULL, *pBmpFile, IMAGE_BITMAP, 0, 0, // LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE); STGMEDIUM stgm; stgm.tymed = TYMED_GDI; stgm.hBitmap = bmp; stgm.pUnkForRelease = NULL; FORMATETC fm; fm.cfFormat = CF_BITMAP; fm.ptd = NULL; fm.dwAspect = DVASPECT_CONTENT; fm.lindex = -1; fm.tymed = TYMED_GDI; //创建输入数据源 IStorage *pStorage; //分配内存 LPLOCKBYTES lpLockBytes = NULL; SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes); if (sc != S_OK) AfxThrowOleException(sc); ASSERT(lpLockBytes != NULL); sc = ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage); if (sc != S_OK) { VERIFY(lpLockBytes->Release() == 0); lpLockBytes = NULL; AfxThrowOleException(sc); } ASSERT(pStorage != NULL); COleDataSource *pDataSource = new COleDataSource; pDataSource->CacheData(CF_BITMAP, &stgm); LPDATAOBJECT lpDataObject = (LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject); //获取RichEdit的OLEClientSite LPOLECLIENTSITE lpClientSite; CRichEditCtrl* m_rch = (CRichEditCtrl*)FromHandle(m_contentHwnd); m_rch->GetIRichEditOle()->GetClientSite(&lpClientSite); //创建OLE对象 IOleObject *pOleObject; sc = OleCreateStaticFromData(lpDataObject,IID_IOleObject,OLERENDER_FORMAT, &fm,lpClientSite,pStorage,(void **)&pOleObject); if(sc!=S_OK) AfxThrowOleException(sc); //插入OLE对象 REOBJECT reobject; ZeroMemory(&reobject, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); CLSID clsid; sc = pOleObject->GetUserClassID(&clsid); if (sc != S_OK) AfxThrowOleException(sc); reobject.clsid = clsid; reobject.cp = REO_CP_SELECTION; reobject.dvaspect = DVASPECT_CONTENT; reobject.poleobj = pOleObject; reobject.polesite = lpClientSite; reobject.pstg = pStorage; HRESULT hr = m_rch->GetIRichEditOle()->InsertObject( &reobject ); delete pDataSource; }
大神们,帮帮小白,编写的不知道错哪了,基于MFC,编写一个抓图的程序,开发工具为VC++6.0。
CRect rect(m_StartPoint.x,m_StartPoint.y,m_EndPoint.x,m_EndPoint.y); //ClientToScreen(rect); m_leftdown =0; Invalidate(FALSE);//更新界面 CClientDC dc(this); /* HBITMAP bitmap =CreateCompatibleBitmap(dc.m_hDC,rect.Width(),rect.Height());*/ //复制矩形内容 CDC bmemDC; bmemDC.CreateCompatibleDC(GetDC()); CBitmap bmprect; bmprect.CreateCompatibleBitmap(GetDC(),rect.Width(),rect.Height()); bmemDC.SelectObject(&bmprect); ///////////////////////////////////////////////////////////////////////////////////////// BITMAP mbitmap; //将位图信息填充到一个缓冲区内 bmprect.GetBitmap(&mbitmap); bmemDC.BitBlt(0,0,mbitmap.bmWidth,mbitmap.bmHeight,GetDC(),m_StartPoint.x,m_StartPoint.y,SRCCOPY); BITMAPINFOHEADER bih = {0};//位图信息头 bih.biBitCount = mbitmap.bmBitsPixel;//每个像素字节大小 bih.biCompression = BI_RGB; bih.biHeight = mbitmap.bmHeight;//高度 bih.biPlanes = 1; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biSizeImage = mbitmap.bmWidthBytes * mbitmap.bmHeight;//图像数据大小 bih.biWidth = mbitmap.bmWidth;//宽度 BITMAPFILEHEADER bfh = {0};//位图文件头 bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量 bfh.bfSize = bfh.bfOffBits + mbitmap.bmWidthBytes * mbitmap.bmHeight;//文件总的大小 bfh.bfType = (WORD)0x4d42; byte * p = new byte[mbitmap.bmWidthBytes * mbitmap.bmHeight];//申请内存保存位图数据 GetDIBits(bmemDC.m_hDC, (HBITMAP) bmprect.m_hObject, 0, rect.Height(), p, (LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据 //////////////////////////////////////////////////////////////////////////////////////// FILE *fp = fopen("bitfile.bmp", "w+b"); fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头 fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头 fwrite(p, 1, mbitmap.bmWidthBytes * mbitmap.bmHeight, fp);//写入位图数据 fclose(fp); ![图片说明](https://img-ask.csdn.net/upload/201705/19/1495169924_877169.png) 不知道怎么办?各位大神帮帮忙 小白万分感激,不要沉啊,拜托了,麻烦各位了,谢谢
MFC中如何指定位置、大小显示图片
如图所示,我想在红色框框内显示人员的照片信息,规定就是按照框框那么大,请问该怎么办呢? ![图片说明](https://img-ask.csdn.net/upload/201605/11/1462952322_623171.jpg) ```void CbitMapDlg::OnBnClickedCheckButton() { // TODO: 在此添加控件通知处理程序代码 CBitmap bitmap; HBITMAP hBmp; bitmap.LoadBitmap(IDB_BITMAP1); hBmp = (HBITMAP)bitmap.GetSafeHandle(); m_Picture.SetBitmap(hBmp); }
mfc显示透明背景代码看不大懂
/*-----------------显示透明背景图片-------------------*/ void CHIT_MOUSE::TransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart, short yStart, short xadd, short yadd, COLORREF cTransparentColor) { BITMAP m_bm; COLORREF cColor; // 创建临时DC HDC hMem, hBack, hObject, hTemp, hSave; hBack = CreateCompatibleDC(hdc); hObject = CreateCompatibleDC(hdc); hMem = CreateCompatibleDC(hdc); hSave = CreateCompatibleDC(hdc); hTemp = CreateCompatibleDC(hdc); // 选入位图 SelectObject(hTemp, hBitmap); GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&m_bm); POINT ptSize;//显示位图宽高 ptSize.x = m_bm.bmWidth; // 取得位图的宽度 ptSize.y = m_bm.bmHeight; // 取得位图的该度 DPtoLP(hTemp, &ptSize, 1); // 转换为逻辑点值 HBITMAP bmBack, bmObject, bmMem, bmSave;// 创建临时位图 // 单色位图 bmBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); bmObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); // 与设备兼容位图 bmMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); // 将创建的临时位图选入临时DC中 HBITMAP OldbmBack, OldbmObject, OldbmMem, OldbmSave; OldbmBack = (HBITMAP)SelectObject(hBack, bmBack); OldbmObject = (HBITMAP)SelectObject(hObject, bmObject); OldbmMem = (HBITMAP)SelectObject(hMem, bmMem); OldbmSave = (HBITMAP)SelectObject(hSave, bmSave); // 设置映射模式 SetMapMode(hTemp, GetMapMode(hdc)); // 先保留原始位图 BitBlt(hSave, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY); // 将背景颜色设置为需透明的颜色 cColor = SetBkColor(hTemp, cTransparentColor); // 创建目标屏蔽码 BitBlt(hObject, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY); SetBkColor(hTemp, cColor);// 恢复源DC的原始背景色 // 创建反转的目标屏蔽码 BitBlt(hBack, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, NOTSRCCOPY); // 拷贝主DC的背景到目标DC BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY); // 屏蔽位图的显示区 BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, SRCAND); // 屏蔽位图中的透明色 BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hBack, 0, 0, SRCAND); // 将位图与目标DC的背景左异或操作 BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCPAINT); // 拷贝目标到屏幕上 StretchBlt(hdc, xStart, yStart, ptSize.x+xadd, ptSize.y+yadd, hMem, 0, 0, ptSize.x, ptSize.y,SRCCOPY); // 恢复原始位图 BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hSave, 0, 0, SRCCOPY); // 删除临时内存位图 DeleteObject(SelectObject(hBack, OldbmBack)); DeleteObject(SelectObject(hObject, OldbmObject)); DeleteObject(SelectObject(hMem, OldbmMem)); DeleteObject(SelectObject(hSave, OldbmSave)); // 删除临时内存DC DeleteDC(hMem); DeleteDC(hBack); DeleteDC(hObject); DeleteDC(hSave); DeleteDC(hTemp); } 这段代码的含义及用法
两个窗口穿参数,指针数据丢失
在头文件里面声明了一个 struct Param { BITMAPINFO *pinfo; BYTE *pbit; DWORD h; DWORD w; };结构体 程序绝大部分如下 #include "stdafx.h" #include <windows.h> #include <windowsx.h> #include "resource.h" #include "MainDlg.h" #include "SHOWDLG.h" #include <stdio.h> #include <commdlg.h> BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND chuli=GetDlgItem(hwnd,IDC_chuli); ComboBox_InsertString(chuli,-1,TEXT("傅里叶变换")); ComboBox_InsertString(chuli,-1,TEXT("什么二值化")); ComboBox_InsertString(chuli,-1,TEXT("获取边缘梯度图像")); ComboBox_InsertString(chuli,-1,TEXT("还有什么阈值")); return TRUE; } void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { HWND chuli=GetDlgItem(hwnd,IDC_chuli); int n; OPENFILENAME ofn; char szFile[MAX_PATH]; DWORD m_nHeight, m_nWidth; HWND h_static=GetDlgItem(hwnd,IDC_s); HDC hdc_static=GetDC(h_static); Param params; switch(id) { case IDC_OK://为什么不能开同一张图片两次? { ZeroMemory(&ofn,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0BMP\0*.bmp\0JPG\0*.jpg"); ofn.lpstrFile = szFile; ofn.lpstrFile[0] = TEXT('\0');//艹,不加这一句还打不开,不明所以 ofn.nFilterIndex = 3; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.hwndOwner = hwnd; ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if(GetOpenFileName(&ofn)) { if(3==ofn.nFilterIndex) { MessageBox(hwnd,ofn.lpstrFile,TEXT("问好"),MB_OK); HANDLE Hbmp=CreateFile(ofn.lpstrFile,GENERIC_READ |GENERIC_WRITE, 0, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); HANDLE m_Hbmp=CreateFileMapping(Hbmp,NULL,PAGE_READWRITE,0,0x1400000,TEXT("maptest")); if( INVALID_HANDLE_VALUE==m_Hbmp) { MessageBox(hwnd,TEXT("映像创建失败"),TEXT("error"),MB_OK); return; } LPVOID lpBase = MapViewOfFile(m_Hbmp, FILE_MAP_ALL_ACCESS, 0, 0, 0); //params = lpBase; BITMAPFILEHEADER *pFileHeader; BITMAPINFO *pInfoHeader; pFileHeader = (BITMAPFILEHEADER*)lpBase; BYTE *pBits = (BYTE*)lpBase + pFileHeader->bfOffBits; pInfoHeader = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER)); m_nHeight = pInfoHeader->bmiHeader.biHeight; m_nWidth = pInfoHeader->bmiHeader.biWidth; HBITMAP hBitmap = CreateCompatibleBitmap(hdc_static, m_nWidth, m_nHeight); SelectObject(hdc_static, hBitmap); params.w = m_nWidth; params.h = m_nHeight; params.pinfo = pInfoHeader;//结构体指针的赋值有问题 params.pbit = pBits; int nRet = SetDIBitsToDevice(hdc_static,0,0,m_nWidth,m_nHeight,0,0,0,m_nHeight,pBits,pInfoHeader,DIB_RGB_COLORS); InvalidateRect((HWND)Hbmp, NULL, TRUE); DeleteObject(hBitmap); ReleaseDC(hwnd,hdc_static); //UnmapViewOfFile(lpBase); CloseHandle(m_Hbmp); } } } break; case IDC_DOIT: { n=ComboBox_GetCurSel(chuli); HINSTANCE hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); while(n<0) { MessageBox(hwnd,TEXT("请选择处理方式"),TEXT("提示"),MB_OKCANCEL); break; } if(n<0) { break; } switch(n) { //LPARAM *par; //par=(long*)&params; case 0: { DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,(long)&params); MessageBox(NULL,TEXT("傅里叶变换"),TEXT("你选择了"),MB_OK); } break; case 1: { MessageBox(NULL,TEXT("什么二值化"),TEXT("你选择了"),MB_OK); DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300); } break; case 2: { MessageBox(NULL,TEXT("获取边缘梯度图像"),TEXT("你选择了"),MB_OK); DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300); } break; case 3: { MessageBox(NULL,TEXT("还有什么阈值"),TEXT("你选择了"),MB_OK); DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300); } break; default: break; } } break; default: break; } } void Main_OnClose(HWND hwnd) { EndDialog(hwnd, 0); } 然后在另一个窗口函数里面 BOOL SHOWDLG_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { Param * pa = (Param*)lParam ;//DC没有问题,传进来的指针指的地方不对 SetDIBitsToDevice(h_sdc,0,0,pa->w,pa->h,0,0,0,pa->h,pa->pbit,pa->pinfo,DIB_RGB_COLORS); return TRUE; } 调试发现在红色标记语句执行后params里面的数据丢失(之前调试看的数据都正常),这句UnmapViewOfFile(lpBase);不释放就好了,但是传递给另一个窗口的时候结构体里面的数据就全没了,定义全局变量也没用,现在想做的就是在两个窗口里面都显示同一个图片,以后再做图像处理,小弟都是自学的,MFC不太熟悉,想请各位大神指教一下,感激不尽!
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
前端 | 2. 正则
转载请注明以下: 本文转自清自以敬的博客:https://blog.csdn.net/qq_45791147 文章目录1.转义2.正则表达式初步2.1.匹配字符2.1.1.组成元素2.1.2.基础正则的设计 1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转义...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
Docker 从入门到掉坑
Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器。但是docker本身和虚拟机还是有较为明显的出入的。我大致归纳了一下,可以总结为以下几点: docker自身也有着很多的优点,关于它的优点,可以总结为以下几项: 安装docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Doc...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
相关热词 基于c#波形控件 c# 十进制转十六进制 对文件aes加密vc# c#读取栈中所有的值 c# rsa256加密 好 学c# 还是c++ c# 和java的差距 c# curl网络框架 c# https证书请求 c# 中崎
立即提问