CButton 重繪(支援PNG圖片作為背景)
按鈕重繪支援PNG圖片作為背景很使用。可以實現按鈕一種背景圖片,然後滑鼠點選按鈕,增加一個透明的png邊框,也可以修改以下實現滑鼠停留在某個按鈕上面,改變按鈕的狀態。
#if !defined(AFX_PICBUTTON_H__4A8AEB90_4455_44B5_B4BE_20B5B77453E1__INCLUDED_)
#define AFX_PICBUTTON_H__4A8AEB90_4455_44B5_B4BE_20B5B77453E1__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// PicButton.h : header file
//
#define ALIGN_HORZ 0
#define ALIGN_VERT 1
/////////////////////////////////////////////////////////////////////////////
// CPicButton window
class CPicButton : public CButton
{
// Construction
public:
CPicButton();
// Attributes
public:
// Operations
public:
void SetTextColor(COLORREF color) { m_TextColor=color; }
void SetBkColor(COLORREF color) { m_BackColor=color; }
void SetFocusColor(COLORREF color) { m_FocusColor=color; }
void SetBitmapEx(LPCTSTR lpszFile);
void SetBitmapEx(UINT nBitmapID);
void SetBorder(UINT nSet){m_nBorder=nSet;}
void SetTextAlign(UINT nSet){m_nTextAlign=nSet;}
void SetIconAlign(UINT nSet){m_nIconAlign=nSet;}
void SetBackBmp(LPCTSTR lpszFile);
void SetBackBmp(UINT nNormalID);
void SetBitmap(UINT nNormalID,UINT nDisableID=0);
void SetBitmap(LPCTSTR lpszNormal,LPCTSTR lpszDisabled=NULL);
void SetCheck(int nCheck, BOOL bRepaint = TRUE);
void SetStatic(BOOL bSet){m_bStatic=bSet;}
int GetCheck();
void DeleteObject();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPicButton)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CPicButton();
// Generated message map functions
protected:
//{{AFX_MSG(CPicButton)
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg BOOL OnClicked();
afx_msg void OnCaptureChanged(CWnd *pWnd);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
LRESULT OnSetCheck(WPARAM wParam, LPARAM lParam);
LRESULT OnGetCheck(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
private:
COLORREF m_TextColor, m_BackColor,m_FocusColor;
HBITMAP m_bmpNormal,m_bmpDisabled;
CBitmap m_bmpBack,m_bmpButton;
UINT m_nBorder;
UINT m_nTextAlign,m_nIconAlign;
int m_nCheck,m_bCheckBox;
BOOL m_MouseOnButton,m_bStatic;
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_PICBUTTON_H__4A8AEB90_4455_44B5_B4BE_20B5B77453E1__INCLUDED_)
實現
// PicButton.cpp : implementation file
//
#include "stdafx.h"
#include "PicButton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPicButton
CPicButton::CPicButton()
{
m_TextColor=RGB(255,255,255);
m_BackColor=RGB(40,40,70);
m_FocusColor=RGB(255,0,0);
m_nBorder=BF_RECT;
m_nTextAlign=DT_CENTER;
m_nIconAlign=ALIGN_HORZ;
m_bmpNormal=NULL;
m_bmpDisabled=NULL;
m_nCheck=0;
m_bCheckBox=0;
m_MouseOnButton=FALSE;
m_bStatic = 0;
}
CPicButton::~CPicButton()
{
DeleteObject();
}
BEGIN_MESSAGE_MAP(CPicButton, CButton)
//{{AFX_MSG_MAP(CPicButton)
ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()
ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
ON_WM_CAPTURECHANGED()
ON_WM_KILLFOCUS()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
ON_MESSAGE(BM_SETCHECK, OnSetCheck)
ON_MESSAGE(BM_GETCHECK, OnGetCheck)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPicButton message handlers
void CPicButton::DeleteObject()
{
if(m_bmpNormal){
::DeleteObject(m_bmpNormal);
m_bmpNormal=NULL;
}
if(m_bmpDisabled){
::DeleteObject(m_bmpDisabled);
m_bmpDisabled=NULL;
}
if(m_bmpButton.GetSafeHandle()){
m_bmpButton.DeleteObject();
}
if(m_bmpBack.GetSafeHandle()){
m_bmpBack.DeleteObject();
}
}
void CPicButton::SetBitmap(UINT nNormalID,UINT nDisableID)
{
HINSTANCE hInstResource=AfxFindResourceHandle(MAKEINTRESOURCE(nNormalID), RT_BITMAP);
m_bmpNormal=(HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nNormalID), IMAGE_BITMAP, 0, 0, 0);
if(nDisableID)
m_bmpDisabled=(HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nDisableID), IMAGE_BITMAP, 0, 0, 0);
else
m_bmpDisabled=(HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nNormalID), IMAGE_BITMAP, 0, 0, 0);
}
void CPicButton::SetBitmap(LPCTSTR lpszNormal,LPCTSTR lpszDisabled)
{
m_bmpNormal=(HBITMAP)::LoadImage(NULL, lpszNormal, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if(lpszDisabled)
m_bmpDisabled=(HBITMAP)::LoadImage(NULL, lpszDisabled, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
else
m_bmpDisabled=NULL;
}
void CPicButton::SetBitmapEx(LPCTSTR lpszFile)
{
if(lpszFile==NULL){
m_bmpButton.DeleteObject();
}
else{
if(!m_bmpButton.GetSafeHandle())m_bmpButton.DeleteObject();
m_bmpButton.LoadBitmap(lpszFile);
}
}
void CPicButton::SetBitmapEx(UINT nBitmapID)
{
if(nBitmapID==0){
m_bmpButton.DeleteObject();
}
else{
if(!m_bmpButton.GetSafeHandle())m_bmpButton.DeleteObject();
m_bmpButton.LoadBitmap(nBitmapID);
}
}
void CPicButton::SetBackBmp(LPCTSTR lpszFile)
{
if(lpszFile==NULL){
m_bmpBack.DeleteObject();
}
else{
if(!m_bmpBack.GetSafeHandle())m_bmpBack.DeleteObject();
m_bmpBack.LoadBitmap(lpszFile);
}
}
void CPicButton::SetBackBmp(UINT nNormalID)
{
if(nNormalID==0){
m_bmpBack.DeleteObject();
}
else{
if(!m_bmpBack.GetSafeHandle())m_bmpBack.DeleteObject();
m_bmpBack.LoadBitmap(nNormalID);
}
}
void TransparentBlt2(HDC hdcDest, // 目標DC
int nXOriginDest, // 目標X偏移
int nYOriginDest, // 目標Y偏移
int nWidthDest, // 目標寬度
int nHeightDest, // 目標高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起點
int nYOriginSrc, // 源Y起點
int nWidthSrc, // 源寬度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF型別
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 建立相容點陣圖
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立單色掩碼點陣圖
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
// 將源DC中的點陣圖拷貝到臨時DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
// 設定透明色
SetBkColor(hImageDC, crTransparent);
// 生成透明區域為白色,其它區域為黑色的掩碼點陣圖
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
// 生成透明區域為黑色,其它區域保持不變的點陣圖
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// 透明部分保持螢幕不變,其它部分變成黑色
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// "或"運算,生成最終效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
void DrawTransparent(CDC *pDC,int x,int y,HBITMAP hBitmap)
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=memDC.SelectObject(CBitmap::FromHandle(hBitmap));
BITMAP bm;
::GetObject(hBitmap,sizeof(BITMAP),&bm);
COLORREF crTransparent=memDC.GetPixel(0,0);
TransparentBlt2(pDC->m_hDC,x,y,bm.bmWidth,bm.bmHeight,memDC.m_hDC,0,0,bm.bmWidth,bm.bmHeight,crTransparent);
if(pOldBitmap)memDC.SelectObject(pOldBitmap);
}
void DrawTransparent(CDC *pDC,int x,int y,HBITMAP hBitmap,int nIndex)
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=memDC.SelectObject(CBitmap::FromHandle(hBitmap));
BITMAP bm;
::GetObject(hBitmap,sizeof(BITMAP),&bm);
COLORREF crTransparent;
int n = bm.bmHeight;
if( n != 20 )
crTransparent=memDC.GetPixel(0,0);
else
crTransparent=RGB(0,0,0);
TransparentBlt2(pDC->m_hDC,x,y,bm.bmWidth/4-10,bm.bmHeight-5,memDC.m_hDC,nIndex*bm.bmWidth/4,0,bm.bmWidth/4,bm.bmHeight,crTransparent);
if(pOldBitmap)memDC.SelectObject(pOldBitmap);
}
void CPicButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRect rcItem=lpDrawItemStruct->rcItem;
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
BOOL bFocus=lpDrawItemStruct->itemState&ODS_FOCUS;
BOOL bSelected=lpDrawItemStruct->itemState&ODS_SELECTED;
BOOL bDisabled=lpDrawItemStruct->itemState&ODS_DISABLED;
CString strCaption;
GetWindowText(strCaption);
if(m_bCheckBox||m_bmpBack.GetSafeHandle()==NULL)
pDC->FillSolidRect(&rcItem,m_BackColor);///////設定按鈕背景色
else if(m_bmpBack.GetSafeHandle())
DrawTransparent(pDC,0,0,(HBITMAP)m_bmpBack,bDisabled?3:(bSelected?2:(bFocus?1:0)));
if(m_bmpNormal)
{
BITMAP bm;
::GetObject(m_bmpNormal,sizeof(BITMAP),&bm);
if(strCaption.IsEmpty())
{
DrawTransparent(pDC,
(rcItem.Width()-bm.bmWidth)/2,
(rcItem.Height()-bm.bmHeight)/2,
bDisabled?m_bmpDisabled:m_bmpNormal);
}
else
{
if(m_nIconAlign==ALIGN_HORZ)
{
DrawTransparent(pDC,
2,
(rcItem.Height()-bm.bmHeight)/2,
bDisabled?m_bmpDisabled:m_bmpNormal);
rcItem.left+=2+bm.bmWidth+2;
}
if(m_nIconAlign==ALIGN_VERT)
{
DrawTransparent(pDC,
(rcItem.Width()-bm.bmWidth)/2,
0,
bDisabled?m_bmpDisabled:m_bmpNormal);
rcItem.top+=0+bm.bmHeight+0;
}
}
}
if(m_bmpButton.GetSafeHandle())
{
BITMAP bm;
m_bmpButton.GetBitmap(&bm);
bm.bmWidth/=4;
if(strCaption.IsEmpty())
{
DrawTransparent(pDC,
(rcItem.Width()-bm.bmWidth)/2,
(rcItem.Height()-bm.bmHeight)/2,
(HBITMAP)m_bmpButton,
m_bCheckBox?(m_nCheck?0:1):(bDisabled?3:(bSelected?2:(bFocus?1:0)))
);
}
else
{
if(m_nIconAlign==ALIGN_HORZ)
{
if(GetExStyle()&WS_EX_RIGHT)
{
DrawTransparent(pDC,
rcItem.right-bm.bmWidth+3,
(rcItem.Height()-bm.bmHeight)/2,
(HBITMAP)m_bmpButton,
m_bCheckBox?(m_nCheck?0:1):(bDisabled?3:(bSelected?2:(bFocus?1:0)))
);
rcItem.right-=(2+bm.bmWidth+2);
}
else
{
DrawTransparent(pDC,
2,
(rcItem.Height()-bm.bmHeight)/2,
(HBITMAP)m_bmpButton,
m_bCheckBox?(m_nCheck?0:1):(bDisabled?3:(bSelected?2:(bFocus?1:0)))
);
rcItem.left+=2+bm.bmWidth+2;
}
}
if(m_nIconAlign==ALIGN_VERT)
{
DrawTransparent(pDC,
(rcItem.Width()-bm.bmWidth)/2+(bSelected?1:0),
0,
(HBITMAP)m_bmpButton,
m_bCheckBox?(m_nCheck?0:1):(bDisabled?3:(bSelected?2:(bFocus?1:0))));
rcItem.top+=0+bm.bmHeight+0;
}
}
}
if(!strCaption.IsEmpty())
{
if(rcItem.left==0)rcItem.left=2;
pDC->SetTextColor(m_TextColor);
if(bDisabled)pDC->SetTextColor(RGB(192,192,192));
if(!m_bCheckBox)
if(bFocus)pDC->SetTextColor(m_FocusColor);//////設定按鈕獲得焦點時的顏色
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(strCaption,&rcItem,m_nTextAlign|DT_VCENTER|DT_SINGLELINE);
pDC->SetBkMode(OPAQUE);
}
}
void CPicButton::PreSubclassWindow()
{
if(GetButtonStyle()&BS_CHECKBOX)
m_bCheckBox=1;
ModifyStyle(0,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
HBRUSH CPicButton::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
BOOL CPicButton::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
LRESULT CPicButton::OnSetCheck(WPARAM wParam, LPARAM lParam)
{
switch (wParam)
{
case BST_CHECKED:
case BST_INDETERMINATE:
SetCheck(1);
break;
default:
SetCheck(0);
break;
}
return 0;
}
LRESULT CPicButton::OnGetCheck(WPARAM wParam, LPARAM lParam)
{
return GetCheck();
}
void CPicButton::SetCheck(int nCheck, BOOL bRepaint)
{
if (nCheck == 0)
m_nCheck = 0;
else
m_nCheck = 1;
if (bRepaint) Invalidate();
}
int CPicButton::GetCheck()
{
return m_nCheck;
}
BOOL CPicButton::OnClicked()
{
m_nCheck = !m_nCheck;
if(m_bCheckBox)Invalidate();
return FALSE;
}
void CPicButton::OnMouseMove(UINT nFlags, CPoint point)
{
CWnd* pWnd;
CWnd* pParent;
CButton::OnMouseMove(nFlags, point);
if (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return;
pWnd = GetActiveWindow();
pParent = GetOwner();
if ((GetCapture() != this) && (pWnd != NULL && pParent != NULL))
{
m_MouseOnButton = TRUE;
SetFocus();
SetCapture();
Invalidate();
}
else
{
CRect rc;
GetClientRect(&rc);
if(!rc.PtInRect(point)){
if(m_MouseOnButton == TRUE){
m_MouseOnButton = FALSE;
Invalidate();
}
if(!(nFlags & MK_LBUTTON)) ReleaseCapture();
}
}
}
void CPicButton::OnKillFocus(CWnd * pNewWnd)
{
CButton::OnKillFocus(pNewWnd);
if(m_MouseOnButton == TRUE){
m_MouseOnButton = FALSE;
Invalidate();
}
}
void CPicButton::OnCaptureChanged(CWnd *pWnd)
{
if (m_MouseOnButton == TRUE){
ReleaseCapture();
Invalidate();
}
CButton::OnCaptureChanged(pWnd);
}
相關推薦
CButton 重繪(支援PNG圖片作為背景)
按鈕重繪支援PNG圖片作為背景很使用。可以實現按鈕一種背景圖片,然後滑鼠點選按鈕,增加一個透明的png邊框,也可以修改以下實現滑鼠停留在某個按鈕上面,改變按鈕的狀態。 #if !defined(AFX_PICBUTTON_H__4A8AEB90_4455_
微信小程式 上傳圖片至阿里雲OSS(支援多圖片上傳)
我們先講下為什麼要把圖片檔案上傳到雲伺服器呢, 有什麼好處呢? 1、能減輕我們自己伺服器的頻寬 如果一個程式裡有多處地方用到使用者上傳圖片等功能的話,建議還是放到阿里雲或者千牛雲等其他平臺上來儲存我們的圖片,可以給公司的伺服器減少很多壓力,磁碟儲存也就不會太大 2、提升使用者體驗感
win32用GDI+載入png圖片作為背景圖
#include <windows.h> #include <gdiplus.h> /* GDI+ startup token */ ULONG_PTR gdiplusStartupToken; /* Declare Windows procedure */ LRESULT CA
HTML5 CSS3 經典案例:無外掛拖拽上傳圖片 (支援預覽與批量) (一)
上傳基本是專案中經常出現的,一般採用:1、form提交 2、flash3、html5form提交會重新整理頁面,很難做到非同步上傳;flash可能是用得比較多了,因為可以兼顧到幾乎所有的瀏覽器,我之前一直會用jquery的uploadify作為專案中的上傳工具,uploadi
讓ie6支援png圖片的透明
一個老外寫的支援png圖片的透明,背景定位。 DD_belatedPNG_0.0.8a-min.js 用法 <!--[if lte IE 6]> <script src="DD_belatedPNG_0.0.8a.js" type="tex
CButton重繪
MFC下一個簡單的按鈕重繪,功能不是那麼全 #if !defined(AFX_BMPBUTTON_H__FBB70540_EC88_4021_9272_574C1A7A571B__INCLUDED_) #define AFX_BMPBUTTON_H__FBB7
HTML5 CSS3 經典案例:無外掛拖拽上傳圖片 (支援預覽與批量) (二)
效果圖1:效果圖2:好了,請允許我把圖片貼了兩遍,方便大家看效果了~可以看出我們的圖片的li的html其實還是挺複雜的,於是我把html文件做了一些修改:<span style="font-size:12px;"><body> <div id="uploadBox"> &
回流和重繪(轉載)
htm rendering 進行 text rep 參考 什麽事 params tee 回流和重繪可以說是每一個web開發者都經常聽到的兩個詞語,我也不例外,可是一直不是很清楚這兩步具體做了什麽事情。最近由於部門內部要做分享,所以對其進行了一些研究,看了一些博客和書籍,整
回流(reflow)與重繪(repaint)
瀏覽器 gin style 圖片 。。 css 徹底 off 繪制 回流與重繪這兩個詞語經常見到,面試中這兩個詞語的出現的頻率也比較高,每每別人談到回流與重繪時,哦,這個我知道,但是讓我講個因果所以然,好像嗯。。。好像我並不是懂的很徹底 什麽是回流(reflow)? R
移動端設置, mobile , 一張圖片作為背景 ,平鋪 ,自動拉伸 , 圖片 鋪滿視界 ,窗口. background-image , background-size, background-repeat
效果 背景 dev 技術 oct pla div osi eight 1. 效果: 瀏覽器: 手機模擬: 2.代碼: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head&g
圖片作為背景並且是鏈接的寫法(背景圖片加鏈接)
span 方法 http img spl ack 文本 生活 指向 圖片作為背景,並且是鏈接的寫法。例如網站的logo圖片。例如:土豆的logo圖片 <a title="土豆網 tudou.com 每個人都是生活的導演" href="http://www.jb51.
純HTML自動刷新頁面或重定向(http-equiv屬性的refresh)
表示 str 網址 http baidu keywords word 自動 aid refresh 屬性值 -- 刷新與跳轉(重定向)頁面 refresh出現在http-equiv屬性中,使用content屬性表示刷新或跳轉的開始時間與跳轉的網址 refresh示例一:
雙棧實現整數(支援大於十的整數)計算器【資料結構】
通過棧的操作實現簡單的計算器 首先定義兩個棧,一個叫s_num用來存放運算元,另一個叫s_opt用來存放操作符。 再定義一個字元陣列用來存放輸入的表示式,初始化為0; 當表示式的字元不為‘/0’時,或者操作符棧中不為空的時候,就要一直執行程式! 在執行的時候做兩個判斷,輸入的不是數字
windows下PHP獲取視訊第一幀圖片作為背景圖
我在網上找了很多這方面的資料,總結如下:一般用ffmpeg獲取視訊第一幀圖片作為背景圖; ffmpeg的下載連結 http://ffmpeg.org/download.html ; 下載好包,包裡面在
Python3 tkinter 使用圖片作為背景,並在該背景上加輸入框,按鈕
最近用到了tkinter,想用自己喜歡的圖片作為背景,看了不少部落格,可能是我少敲了什麼,很少有能成功執行的,最後終於發現了一個可行方案,於是在這裡記錄一下(程式碼為原創) 圖片使用的p站喜愛畫師的作品(因為是以前儲存的,抱歉沒找到畫師連結),侵刪。 import tk
在Vue專案使用quill-editor帶樣式編輯器(更改插入圖片和視訊) 運用vue-quilt-editor編寫富文字編輯器 自定義圖片路徑 獲取後臺返回路徑
一、首先在main.js 引入 vue-quilt-editorimport VueQuillEditor from 'vue-quill-editor'import 'quill/dist/quill.core.css'import 'quill/dist/quill.s
檔案重定向(採用檔案過濾驅動實現)
Windows的I/O管理器提供了一個方便的方法來重定向一個檔案物件。通常使用檔案過濾驅動(在檔案開啟和檔案建立的操作中)實現該方法。操作方法如下:1、在IRP_MJ_CREATE的分發函式中,獲得FILE_OBJET的FileName屬性。2、用目標檔案的完整路徑替換原有的
Android歌詞轉換器(支援動感歌詞相互轉換)
引言之前為了讓樂樂音樂播放器支援多種歌詞格式,在實現多種歌詞格式解析的時,也想弄一個歌詞轉換器,由於網上Android版的還是比較少的,所以就將該轉換器巢狀到播放器裡面了,其專案地址如下:樂樂音樂播放器。實現功能歌詞轉換器支援ksc、krc和hrc歌詞間的相互轉換及轉換成lr
豎向走馬燈(支援多行或單行)-------簡單實用
1.單行 第一步:在build中做如下操作 (1)Android{ //在Android中增加節點repositories repositories { maven { url 'https://maven.f
java工具類之Excel檔案匯入、讀取資料(支援xls、和xlsx)
所需的jar包:poi的jar包儘量保持一致,不然會報版本不一致的錯誤下面是程式碼:package ReadExcel; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.